Cor.test()
将向量x
和y
作为参数,但我想要成对地测试整个数据矩阵。 Cor()
将此矩阵作为参数就好了,我希望找到一种方法为cor.test()
做同样的事情。
其他人的共同建议似乎是使用cor.prob()
:
https://stat.ethz.ch/pipermail/r-help/2001-November/016201.html
但是这些p值与cor.test()
生成的p值不同! Cor.test()
似乎也比cor.prob()
更适合处理成对删除(我的数据集中有相当多的数据丢失)。
有人有cor.prob()
的替代方案吗?如果解决方案涉及嵌套的for循环,那么就是它(我已经足够R
了,即使这对我来说也是有问题的。)
答案 0 :(得分:38)
corr.test
包中的 psych
旨在执行此操作:
library("psych")
data(sat.act)
corr.test(sat.act)
如评论中所述,要在整个矩阵中复制基础cor.test()
函数中的 p - 值,则需要关闭 p <的调整/ em> - 用于多重比较的值(默认是使用Holm的调整方法):
corr.test(sat.act, adjust = "none")
[但在解释这些结果时要小心!]
答案 1 :(得分:13)
如果您严格遵循cor.test
矩阵格式的p值,这是一个从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也提供了更快的解决方案,但不太容易实现。哦,没有循环:)
修改我的v_outer
包中有一个函数qdapTools
,可以让这个任务变得非常简单:
library(qdapTools)
(out <- v_outer(mtcars, function(x, y) cor.test(x, y)[["p.value"]]))
print(out, digits=4) # for more digits
答案 2 :(得分:5)
可能最简单的方法是使用Hmisc中的rcorr()
。它只需要一个矩阵,因此如果您的数据位于data.frame中,请使用rcorr(as.matrix(x))
。它将返回一个列表,其中包括:1)r成对的矩阵,2)成对n的矩阵,3)r值的p值矩阵。它会自动忽略丢失的数据。
理想情况下,此类功能也应采用data.frames,并根据&{39} New Statistics&#39;输出置信区间。
答案 3 :(得分:3)
接受的解决方案(心理包中的corr.test函数)有效,但对于大型矩阵来说速度极慢。我正在使用与药物敏感性矩阵相关的基因表达矩阵(~20,000到~1,000)(~1,000~500)我不得不停止它,因为它需要永远。
我从mental包中获取了一些代码并直接使用了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)
即使有两个100 x 200矩阵,差异也是惊人的。一秒或两秒对45秒。
> 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
答案 4 :(得分:-1)
“可接受的解决方案(心理软件包中的corr.test
函数有效,但对于大型矩阵而言则极其缓慢。”
如果使用ci=FALSE
,则速度要快得多。
默认情况下,找到置信区间。但是,这会导致速度略有下降。因此,仅对rs
,ts
和ps
设置ci=FALSE
。