30

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

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

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

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

誰かが代替手段を持っていますcor.prob()か?R解決策にネストされたforループが含まれている場合は、そうしてください(これでも問題が発生するほど、私は新しいです)。

4

5 に答える 5

45

corr.testpsychパッケージ内はこれを行うように設計されています:

library("psych")
data(sat.act)
corr.test(sat.act)

コメントに記載されているように、行列全体にわたって基本関数からp値を複製するには、多重比較のためにpcor.test()値の調整をオフにする必要があります(デフォルトではホルムの調整方法を使用します)。

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

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

于 2012-10-28T20:38:58.187 に答える
15

ここからマトリックス形式のpvalueを厳密に追跡している場合は、cor.testVincentから恥知らずに盗まれた解決策があります(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ループはありません:)

編集パッケージには、このタスクを非常に簡単にする関数がありますv_outerqdapTools

library(qdapTools)
(out <- v_outer(mtcars, function(x, y) cor.test(x, y)[["p.value"]]))
print(out, digits=4)  # for more digits
于 2012-10-28T19:45:26.807 に答える
7

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

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

于 2015-05-26T18:58:58.383 に答える
5

受け入れられているソリューション(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つの100x200マトリックスを使用しても、その違いは驚異的でした。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 
于 2017-09-14T01:59:39.053 に答える
-1

「受け入れられた解決策(corr.testpsychパッケージの関数)は機能しますが、大きな行列の場合は非常に遅くなります。」

を使用するci=FALSEと、速度がはるかに速くなります。デフォルトでは、信頼区間が見つかります。ただし、これにより速度がわずかに低下します。したがって、、、、の場合はrstsps設定しci=FALSEます。

于 2018-09-25T09:23:06.597 に答える