【问题标题】:How to find significant correlations in a large dataset如何在大型数据集中找到显着的相关性
【发布时间】:2014-03-03 12:31:33
【问题描述】:

我正在使用 R。 我的数据集有大约 40 个不同的变量/向量,每个都有大约 80 个条目。我试图找到显着的相关性,这意味着我想选择一个变量并让 R 计算该变量与其他 39 个变量的所有相关性。

我试图通过使用带有一个解释变量的线性模型来做到这一点,这意味着:Y=a*X+b。 然后 lm() 命令为我提供了 a 的估计量和 a 的估计量的 p 值。然后我会继续使用我对 X 拥有的其他变量之一,然后再试一次,直到找到一个非常小的 p 值。

我确定这是一个常见问题,是否有某种包或功能可以尝试所有这些可能性(蛮力),显示它们,然后甚至可能按 p 值对它们进行排序?

【问题讨论】:

  • 欢迎来到 SO。在继续分析之前,请阅读xkcd.com/882
  • 这是一个不错的可视化工具:statpics.blogspot.cz/2013/11/correlation-ellipse-matrix.html
  • 你没有一些基于理论的假设吗?您为什么要进行这些测量?
  • 线性模型的部分意义在于,您可以一次根据几个其他变量预测响应变量,而不必为每个预测变量运行单独的模型。

标签: r correlation


【解决方案1】:

要打印显着相关性 (p 列表,您可以使用以下内容。

  1. 使用来自@Richie 的相同演示数据:

    m <- 40
    n <- 80
    the_data <- as.data.frame(replicate(m, runif(n), simplify = FALSE))
    colnames(the_data) <- c("y", paste0("x", seq_len(m - 1)))
    
  2. 安装 Hmisc

    install.packages("Hmisc")
    
  3. 导入库并查找相关性 (@Carlos)

    library(Hmisc)
    correlations <- rcorr(as.matrix(the_data))
    
  4. 循环打印显着相关性的值

    for (i in 1:m){
      for (j in 1:m){
        if ( !is.na(correlations$P[i,j])){
          if ( correlations$P[i,j] < 0.05 ) {
            print(paste(rownames(correlations$P)[i], "-" , colnames(correlations$P)[j], ": ", correlations$P[i,j]))
          }
        }
      }
    }
    

警告

你不应该用它来得出任何严肃的结论;仅对一些探索性分析和制定假设有用。如果你运行了足够多的测试,你会增加随机发现一些重要 p 值的概率:https://www.xkcd.com/882/。有一些统计方法更适合于此,并且会进行一些调整以补偿运行多个测试,例如https://en.wikipedia.org/wiki/Bonferroni_correction

【讨论】:

  • 应该是correlations$P[i,j] &gt; 0.05 而不是correlations$P[i,j] &lt; 0.05
  • @SAVAFA,代码似乎正确correlations$P[i,j] &lt; 0.05,我在上面的描述中犯了一个错误,(p &lt; 0.05) 而不是(p &gt; 0.05)
【解决方案2】:

一种选择是运行相关矩阵:

cor_result=cor(data)
write.csv(cor_result, file="cor_result.csv")

这将文件中的所有变量相互关联并输出一个矩阵。

【讨论】:

    【解决方案3】:

    您可以使用 Hmisc 包中的函数 rcorr

    使用来自 Richie 的相同演示数据:

    m <- 40
    n <- 80
    the_data <- as.data.frame(replicate(m, runif(n), simplify = FALSE))
    colnames(the_data) <- c("y", paste0("x", seq_len(m - 1)))
    

    然后:

    library(Hmisc)
    correlations <- rcorr(as.matrix(the_data))
    

    要访问 p 值:

    correlations$P
    

    要可视化,您可以使用包corrgram

    library(corrgram)
    corrgram(the_data)
    

    这将产生:

    【讨论】:

      【解决方案4】:

      这里有一些可重复性的示例数据。

      m <- 40
      n <- 80
      the_data <- as.data.frame(replicate(m, runif(n), simplify = FALSE))
      colnames(the_data) <- c("y", paste0("x", seq_len(m - 1)))
      

      您可以使用cor 计算两列之间的相关性。此代码遍历除第一列(包含我们的响应)之外的所有列,并计算该列与第一列之间的相关性。

      correlations <- vapply(
        the_data[, -1],
        function(x)
        {
          cor(the_data[, 1], x)
        },
        numeric(1)
      )
      

      然后您可以使用以下方法找到与y 相关性最大的列:

      correlations[which.max(abs(correlations))]
      

      所以知道哪些变量是相关的,哪些其他变量可能很有趣,但请不要从这些知识中得出任何大的结论。您需要正确思考您想要理解的内容,以及您需要使用哪些技术。 Cross Validated 的人可以提供帮助。

      【讨论】:

      • 这个问题是所有变量都被假定为数字。如果因变量(即“y”)是一个因素怎么办?
      【解决方案5】:

      如果您尝试仅使用一个变量来预测 y,那么您必须使用主要与 y 相关的变量。 为此,只需使用命令which.max(abs(cor(x,y)))。如果你想在模型中使用多个变量,那么你必须考虑类似套索估计器的东西

      【讨论】:

        猜你喜欢
        • 2013-04-17
        • 1970-01-01
        • 2022-11-23
        • 2021-02-15
        • 1970-01-01
        • 2023-04-02
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多