Cor.test()
は引数としてベクトルx
とy
を受け取りますが、テストしたいデータのマトリックス全体をペアワイズで持っています。 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
に慣れていないので、これでも問題があります)。
psych
パッケージの_corr.test
_は、これを行うように設計されています。
_library("psych")
data(sat.act)
corr.test(sat.act)
_
コメントに記載されているように、マトリックス全体でベースcor.test()
関数からp-valuesを複製するには、多重比較のためにp-値の調整をオフにします(デフォルトでは、ホルムの調整方法を使用します)。
_ corr.test(sat.act, adjust = "none")
_
[しかし、これらの結果を解釈するときは注意してください!]
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
おそらく最も簡単な方法は、Hmiscのrcorr()
を使用することです。マトリックスのみを使用するため、データがdata.frameにある場合はrcorr(as.matrix(x))
を使用します。 1)rのペアワイズのマトリックス、2)ペアワイズnのマトリックス、3)rのp値のマトリックスを含むリストを返します。欠落データは自動的に無視されます。
理想的には、この種の関数はdata.framesも取り、「 New Statistics 」に沿って信頼区間も出力する必要があります。
受け入れられている解決策(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