web-dev-qa-db-ja.com

cor.test()のマトリックスバージョン

Cor.test()は引数としてベクトルxyを受け取りますが、テストしたいデータのマトリックス全体をペアワイズで持っています。 Cor()はこの行列を引数として問題なく受け取り、cor.test()に対して同じことを行う方法を見つけたいと思っています。

他の人々からの一般的なアドバイスは、cor.prob()を使用することです。

https://stat.ethz.ch/pipermail/r-help/2001-November/016201.html

しかし、これらのp値はcor.test() !!!によって生成されたものと同じではありません。 Cor.test()は、cor.prob()よりもペアワイズ削除を処理するための装備が優れているようです(データセットにかなりの量の欠損データがあります)。

cor.prob()に代わるものはありますか?ソリューションにネストされたforループが含まれる場合は、そうする必要があります(私もRに慣れていないので、これでも問題があります)。

25
Atticus29

psychパッケージの_corr.test_は、これを行うように設計されています。

_library("psych")
data(sat.act)
corr.test(sat.act)
_

コメントに記載されているように、マトリックス全体でベースcor.test()関数からp-valuesを複製するには、多重比較のためにp-値の調整をオフにします(デフォルトでは、ホルムの調整方法を使用します)。

_ corr.test(sat.act, adjust = "none")
_

[しかし、これらの結果を解釈するときは注意してください!]

38
Sacha Epskamp

cor.testのマトリックス形式でpvaluesを厳密に求めている場合、Vincentから恥知らずに盗まれたソリューションがあります( [〜#〜] link [〜#〜] ):

cor.test.p <- function(x){
    FUN <- function(x, y) cor.test(x, y)[["p.value"]]
    z <- outer(
      colnames(x), 
      colnames(x), 
      Vectorize(function(i,j) FUN(x[,i], x[,j]))
    )
    dimnames(z) <- list(colnames(x), colnames(x))
    z
}

cor.test.p(mtcars)

注:Tommyは、暗黙のうちに簡単ではありませんが、より高速なソリューションも提供します。ああ、いいえforループ:)

Editこのタスクを非常に簡単にするqdapToolsパッケージにv_outer関数があります:

library(qdapTools)
(out <- v_outer(mtcars, function(x, y) cor.test(x, y)[["p.value"]]))
print(out, digits=4)  # for more digits
13
Tyler Rinker

おそらく最も簡単な方法は、Hmiscのrcorr()を使用することです。マトリックスのみを使用するため、データがdata.frameにある場合はrcorr(as.matrix(x))を使用します。 1)rのペアワイズのマトリックス、2)ペアワイズnのマトリックス、3)rのp値のマトリックスを含むリストを返します。欠落データは自動的に無視されます。

理想的には、この種の関数はdata.framesも取り、「 New Statistics 」に沿って信頼区間も出力する必要があります。

5
Deleet

受け入れられている解決策(psychパッケージのcorr.test関数)は機能しますが、大きな行列の場合は非常に遅くなります。私は、薬物感受性マトリックス(〜1,000 x〜500)に相関する遺伝子発現マトリックス(〜20,000 x〜1,000)で作業していましたが、それは永遠にかかっていたため、停止しなければなりませんでした。

Psychパッケージからいくつかのコードを取得し、代わりにcor()関数を直接使用して、はるかに良い結果を得ました。

# find (pairwise complete) correlation matrix between two matrices x and y
# compare to corr.test(x, y, adjust = "none")
n <- t(!is.na(x)) %*% (!is.na(y)) # same as count.pairwise(x,y) from psych package
r <- cor(x, y, use = "pairwise.complete.obs") # MUCH MUCH faster than corr.test()
cor2pvalue = function(r, n) {
  t <- (r*sqrt(n-2))/sqrt(1-r^2)
  p <- 2*(1 - pt(abs(t),(n-2)))
  se <- sqrt((1-r*r)/(n-2))
  out <- list(r, n, t, p, se)
  names(out) <- c("r", "n", "t", "p", "se")
  return(out)
}
# get a list with matrices of correlation, pvalues, standard error, etc.
result = cor2pvalue(r,n)

2つの100 x 200マトリックスでも、違いは驚くほどでした。 45秒に対して1〜2秒。

> system.time(test_func(x,y))
   user  system elapsed 
  0.308   2.452   0.130 
> system.time(corr.test(x,y, adjust = "none"))
   user  system elapsed 
 45.004   3.276  45.814 
3
Nick Clark