4

是否可以从 stats 包中强制距离对象为 0 以外的值?

在这里,我尝试将其强制为其他内容,我可以更改上部或下部,但不能更改对角线:

set.seed(10)
x <- matrix(rnorm(25), ncol = 5)
y <- dist(x, diag =TRUE)
z <- 1 - as.matrix(y)
as.dist(z, diag =TRUE)

给出:

           1          2          3          4          5
1  0.0000000                                            
2 -0.9030066  0.0000000                                 
3 -0.9803571 -1.9319785  0.0000000                      
4 -1.5249747 -2.3673155 -1.5928891  0.0000000           
5 -2.7903980 -2.8020380 -2.2491893 -1.5839067  0.0000000

而不是预期的:

           1          2          3          4          5
1  1.0000000                                            
2 -0.9030066  1.0000000                                 
3 -0.9803571 -1.9319785  1.0000000                      
4 -1.5249747 -2.3673155 -1.5928891  1.0000000           
5 -2.7903980 -2.8020380 -2.2491893 -1.5839067  1.0000000

也许我必须将其作为矩阵对象输出,因为有些东西会强制对角线不为 0,这会导致它不符合处理“dist”对象的方式。

4

2 回答 2

6

不与dist(); 它不存储对角线,只是一个标志,指示它是否应该通过该print()方法打印。

这并不意外。dist()是一种存储距离矩阵的紧凑方式,通常不是对称矩阵。在距离矩阵中,根据定义,观察值与自身之间的距离为 0。因此dist(),对角线视为微不足道的事物,而不是存储它。

如果我想做你想做的事,我会使用胆量dist()并将数据存储dist()在一个函数中,比如mydist()使用 class "mydist",然后编写print.mydist()print.dist()方法中获取代码,但对对角线使用另一个值,然后编写as.matrix.mydist()转换为矩阵。您的类可以存储对角线的值(如果它们不同),也可以只存储您希望对角线的单个值。

基本上,您需要做的就是将您想要的对角线值存储为一个额外的属性,然后提供从该属性中提取print()as.matrix()方法来打印或填充矩阵。

于 2013-01-27T16:08:32.380 回答
3

dist 对象不是矩阵,尽管有一个强制函数可以制作一个,(你已经知道了。)如果你想要一个像 dist 对象这样的矩阵对象,你可以这样做:

> z <- as.matrix(y)
> diag(z) <- 1
> z[upper.tri(z)] <- NA
> z
         1        2        3        4  5
1 1.000000       NA       NA       NA NA
2 2.515850 1.000000       NA       NA NA
3 2.093508 2.443131 1.000000       NA NA
4 2.734773 1.985341 2.652412 1.000000 NA
5 1.107235 2.012257 2.134162 1.913537  1
于 2013-01-27T16:11:55.957 回答