9

6 列 37 行の分割表データ マトリックスがあります。コレスポンデンス分析用の行プロファイルと列プロファイルを得るには、カイ二乗変換を適用する必要があります。

残念ながら、ネストされたループを使用してデータを変換し、CA を実行する必要があると言われました (R でより賢明な方法で行うのではなく)。ネストされたループに使用する構造が与えられました。

transformed.data=data0

for (row.index in 1:nrow(data)) {
  for (col.index in 1:ncol(data)) {
    transfomed.data[row.index,col.index]=
       "TRANSFORMATION"[row.index,col.index]
  }
}

ネストされたループを使用して理解していることから、最初に「TRANSFORMATION」を行に適用し、次に列に適用します。

行プロファイルを取得するためにデータに対して実行したい変換は次のとおりです。

( X( ij ) / sum( X( i ) ) ) / sqrt( sum( X( j ) ) )

列プロファイルを取得するためにデータに対して実行したい変換は次のとおりです。

( X( ij ) / sum( X( j ) ) ) / sqrt( sum( X( i ) ) )

ネストされたループの最後の行に「TRANSFORMATION」として何を入力して、プロファイルの目的の変換を出力できるようにしますか。そうでなければ、ここでネストされたループのポイントを理解していない場合は、それによって何ができるかを説明してください.

これは私のデータのサブセットのコードです:

matrix(c(15366,2079,411,366,23223,2667,699,819,31632,2724,717,1473,49938,3111,1062,11964)
,nrow=4,ncol=4,byrow=T)

したがって、このサブセットを単独で使用すると、最初の行の行プロファイルは次のようになると予想されます。

0.002432689 0.0003291397 6.506803e-05 5.794379e-05

そして、最初の列の列プロファイルは次のようになります。

0.0009473414, 0.0132572344, 0.0572742202, 0.0132863528 
4

1 に答える 1

1

これらのタイプの計算では、単一のループさえも必要とせずにこれを使用できます。方程式を書き直すと、次のようになります。

Xtrans [i,j] = X [i,j] / ( sum( X [i, ] ) * sqrt( sum( X [ ,j] ) ) )

sum( X [i, ] ) * sqrt( sum( X [ ,j] ) ) を表す行列を取得するには、関数を使用するouter()か、次の%o%ようにします。

rowSums(X) %o% sqrt(colSums(X))

または、列変換の場合:

sqrt(rowSums(X)) %o% colSums(X)

あなたがする必要がある唯一のことは、元の行列をこれで割ることです。たとえば、 col 変換の場合です。

TEST <- matrix(
               c(15366,2079,411,366,23223,2667,699,819,
                 31632,2724,717,1473,49938,3111,1062,11964),
                 nrow=4,ncol=4,byrow=T)

> TEST / (sqrt(rowSums(TEST)) %o% colSums(TEST))
             [,1]        [,2]        [,3]         [,4]
[1,] 0.0009473414 0.001455559 0.001053892 0.0001854284
[2,] 0.0011674098 0.001522501 0.001461474 0.0003383284
[3,] 0.0013770523 0.001346668 0.001298230 0.0005269580
[4,] 0.0016167998 0.001143812 0.001430074 0.0031831055

ほぼ同じ方法で、行の変換を計算できます。

手計算を行うと、インデックス表記を正しく理解していれば、私の解が正しいことを確認できます (つまり、i は行を表し、j は列を表します)。あなたが期待する数字は、あなたが期待すると言うものではありません。あなたに見せるために:

> ( TEST[1,2] / sum(TEST[,2]) ) / sqrt(sum(TEST[1,]))
[1] 0.001455559

あなたが話しているカイ二乗正規化は、実際にはパッケージの関数decostandにあります。veganデフォルトでは、メソッドはマトリックス合計の平方根を掛けて調整することに注意してください。これは、コレスポンデンス分析では理にかなっています。

この修正を使用したくない場合は、次のように列変換なども取得できます。

> require(vegan)
> decostand(TEST,method="chi.square",MARGIN=2)/sqrt(sum(TEST))
             [,1]         [,2]        [,3]        [,4]
[1,] 0.0009473414 0.0011674098 0.001377052 0.001616800
[2,] 0.0014555588 0.0015225011 0.001346668 0.001143812
[3,] 0.0010538924 0.0014614736 0.001298230 0.001430074
[4,] 0.0001854284 0.0003383284 0.000526958 0.003183106
attr(,"decostand")
[1] "chi.square"
于 2012-10-02T13:20:43.227 に答える