3

次のタイプ(ただし、変数と ind の数が非常に多い)データがあります。

    mydf <- data.frame (Inv = 1:6, varA = c(1,1,1,  0,1,1),
   varB = c(1,0,1,  0, 1,1), varC = c(1,0,0,  0,1,1), varD = c(1,1,1,  0,1,1), 
     varE = c(1,0,1,  0, 1,1), varF = c(1,1,1,  0, 1,1))

mydf
  Inv varA varB varC varD varE varF
1   1    1    1    1    1    1    1
2   2    1    0    0    1    0    1
3   3    1    1    0    1    1    1
4   4    0    0    0    0    0    0
5   5    1    1    1    1    1    1
6   6    1    1    1    1    1    1

すべての 1 対 1 の比較 (変数と個人/被験者の両方) を実行し、それらが重複している場合は 1 つだけを保持し、重複した個人/変数の名前をログとして別のファイルに保存したい:

上記のデータの例:

変数の中で:

varA is exactly same as varD and varF - so I will just keep varA only in new data

mydf$varA == mydf$varE
[1]  TRUE TRUE  TRUE  TRUE  TRUE  TRUE

varB and varE has exactly same data - so I will just keep varB
varC is unique

Inv(つまり、件名)の中で:

1, 5 and 6 are same  -> so just keep 1

したがって、結果の出力ファイルは

        mydf <- data.frame (Inv = 1:4, varA = c(1,1,1,  0),
       varB = c(1,0,1,  0), varC = c(1,0,0,  0))
  Inv varA varB varC
1   1    1    1    1
2   2    1    0    0
3   3    1    1    0
4   4    0    0    0

おそらく相関行列によって重複を見つけることができます:

cor(mydf[,-1])
          varA      varB      varC      varD      varE      varF
varA 1.0000000 0.6324555 0.4472136 1.0000000 0.6324555 1.0000000
varB 0.6324555 1.0000000 0.7071068 0.6324555 1.0000000 0.6324555
varC 0.4472136 0.7071068 1.0000000 0.4472136 0.7071068 0.4472136
varD 1.0000000 0.6324555 0.4472136 1.0000000 0.6324555 1.0000000
varE 0.6324555 1.0000000 0.7071068 0.6324555 1.0000000 0.6324555
varF 1.0000000 0.6324555 0.4472136 1.0000000 0.6324555 1.0000000

このプロセスを自動化できますか?

4

4 に答える 4

10

パッケージfindCorrelationから使用することもできます:caret

findCorrelation(x, cutoff = .90, verbose = FALSE)

出力は、削除する列を示すインデックスのベクトルです。

于 2012-11-21T09:52:10.113 に答える
6

これでうまくいくはずです:

dat <- mydf[-1]
cMat <- abs(cor(dat)) >= (1 - .Machine$double.eps^0.5)
whichKeep <- which(rowSums(lower.tri(cMat) * cMat) == 0)
cbind(mydf[1], mydf[whichKeep + 1])

  Inv varA varB varC
1   1    1    1    1
2   2    1    0    0
3   3    1    1    0
4   4    0    0    0
5   5    1    1    1
6   6    1    1    1
于 2012-05-29T16:35:21.583 に答える
2

これは非常に疑わしい統計的作業ですが、その相関行列で 1 であり、上の三角形にある要素を特定することは難しくありません。

cmat <- cor(mydf[,-1])
hicorr <- which(row(cmat) < col(cmat) & cmat==1, arr.ind=TRUE)[,"col"]
hicorr
#varA varB varA varD 
#   4    5    6    6 

mydf[ , -hicorr]
  Inv varA varB varF
1   1    1    1    1
2   2    1    0    1
3   3    1    1    1
4   4    0    0    0
5   5    1    1    1
6   6    1    1    1
于 2012-05-29T16:31:29.353 に答える
1

機能選択/次元削減を実行しようとしていると理解しています。この場合、CRAN のFSelectorパッケージを見てください。特に、いくつかの相関ベースのフィルターがありlinear.correlation(formula, data)ます。詳しくはこちらをご覧ください。

于 2012-05-29T16:30:30.107 に答える