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

「dist」オブジェクトの処理方法に準拠しない原因となる対角線を 0 にしないようにすることについて何かがあるため、代わりに行列オブジェクトとして出力する必要があるかもしれません。

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 に答える