首页 文章

cor.test()的矩阵版本

提问于
浏览
24

Cor.test() 将矢量 xy 作为参数,但我有一个完整的数据矩阵,我想成对测试 . 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 ,因为即使这对我来说也是有问题的) .

5 回答

  • 13

    psych 包中的 corr.test 旨在执行此操作:

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

    如评论中所述,要在整个矩阵上复制基础 cor.test() 函数的p值,则需要关闭p值的调整以进行多次比较(默认为使用Holm的调整方法):

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

    [但在解释这些结果时要小心!]

  • 5

    如果您严格遵循 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也提供了更快的解决方案,但不太容易实现 . 哦,没有循环:)

    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
    
  • 37

    可能最简单的方法是使用Hmisc中的 rcorr() . 它只需要一个矩阵,所以如果你的数据在data.frame中,请使用 rcorr(as.matrix(x)) . 它将返回一个列表,其中包括:1)r成对的矩阵,2)成对n的矩阵,3)r的p值矩阵 . 它会自动忽略丢失的数据 .

    理想情况下,此类函数也应采用data.frames,并输出置信区间符合'New Statistics' .

  • 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
    
  • -1

    “已接受的解决方案(心理包中的功能)可以正常工作,但对于大型矩阵来说速度非常慢 . ”

    如果你使用 ci=FALSE ,那么速度要快得多 . 默认情况下,会找到置信区间 . 但是,这会导致速度略有下降 . 所以,对于 rstsps ,设置 ci=FALSE .

相关问题