【问题标题】:Chi-squared test of independence on all combinations of columns in a dataframe in RR中数据框中所有列组合的独立性卡方检验
【发布时间】:2016-05-23 13:42:36
【问题描述】:

这是我第一次在这里发帖,我希望这一切都在正确的地方。一段时间以来,我一直在使用 R 进行基本的统计分析,但还没有真正将它用于任何具有计算挑战性的事情,而且我在 R 的编程/数据操作方面非常初学者。

我拥有单个流域内 323 个地块中 72 种植物物种的存在/不存在(二进制)数据。数据框有 323 行,每行代表一个地块,有 72 列,每列代表一个物种。这是前 4 列的样本(缺少一些行号,因为 323 个地块是大量预先分配的地块的子集,并非所有地块都进行了调查):

> head(plots[,1:4])
 Agrostis.canina Agrostis.capillaris Alchemilla.alpina Anthoxanthum.odoratum
1               1                   0                 0                     0
3               0                   0                 0                     0
4               0                   0                 0                     0
5               0                   0                 0                     0
6               0                   0                 0                     0
8               0                   0                 0                     0

我想确定该流域中的任何植物物种是否与其他任何植物物种相关,如果是,是正相关还是负相关。为此,我想对每个物种组合进行卡方独立性检验。我需要为每个物种x物种比较创建一个 2x2 列联表,对每个列联表运行卡方检验,并保存输出。最终,我想通过物种测试得出所有物种的列表或矩阵,以显示物种组合是否具有积极、消极或没有显着关联。我还想合并一些代码,仅当所有预期值都大于 5 时才将关联显示为正数。

我已经开始编写以下函数:

CHI <- function(sppx, sppy) 
{test <- chisq.test(table(sppx, sppy)) 
result <- c(test$statistic, test$p.value,
        sign((table(sppx, sppy) - test$expected)[2,2]))
return(result)
}

这将返回以下内容:

> CHI(plots$Agrostis.canina, plots$Agrostis.capillaris)

X-squared                             
1.095869e-27  1.000000e+00 -1.000000e+00 
Warning message:
In chisq.test(chitbl) : Chi-squared approximation may be incorrect

现在我正在尝试找出一种方法来将此函数应用于数据框中的每个物种x物种组合。我基本上希望 R 获取每一列,将 CHI 函数依次应用于该列和其他列,依此类推,从数据框中减去每一列,这样就不会对同一物种对进行两次测试.我尝试了各种方法来尝试使用“for”循环或“apply”函数,但无法弄清楚这一点。 我希望这足够清楚。这里的任何帮助将不胜感激。我曾尝试在网上寻找针对此特定问题的现有解决方案,但未能找到任何真正有帮助的解决方案。如果有人可以将我链接到对此的现有答案,那也很棒。

【问题讨论】:

    标签: r chi-squared


    【解决方案1】:

    您需要combn 函数来查找列的所有组合,然后将它们应用到您的函数中,如下所示:

    apply(combn(1:ncol(plots), 2), 2, function(ind) CHI(plots[, ind[1]], plots[, ind[2]]))
    

    【讨论】:

      【解决方案2】:

      我认为您正在寻找这样的东西。我使用了 iris 数据集。

      require(datasets)
      ind<-combn(NCOL(iris),2)
      lapply(1:NCOL(ind), function (i) CHI(iris[,ind[1,i]],iris[,ind[2,i]]))
      

      【讨论】:

      • @Psidom 你速度超快;抱歉,我无法删除我的答案,因为没有删除按钮。这将教会我在发布之前刷新。
      • 非常感谢您的帮助!我尝试将此代码用于我的数据:` > plotc > lapply(1:NCOL(data), function (i) CHI(plots[,plotc[1,i]] ,plots[,plotc[2,i]])) [[1]] X-squared 1.095869e-27 1.000000e+00 -1.000000e+00 ` 这将返回单个输出。我想输出每个单独的卡方检验的结果——组合表中的每个元素一个。抱歉,这在我最初的问题中可能不清楚。你知道实现这一目标的方法吗?再次感谢
      • 你在你的代码中指定了只给你一个输出。如果您希望它们全部删除代码末尾的 [[1]] 并只保留 plotc &lt;- combn(NCOL(plots),2); lapply(1:NCOL(data), function (i) CHI(plots[,plotc[1,i]],plots[,plotc[2,i]]))
      • 抱歉,我的格式很差 - 我认为在我的代码段的任一侧放置“`”会使其显示为代码,但显然不是。 “ [[1]] ”来自控制台的第一行 R 输出,而不是我的代码。我正在运行您刚刚在评论中显示的代码,它返回一个长度为 1 的列表。
      • 我知道问题出在哪里,将NCOL(data) 更改为NCOL(plotc)。在我的代码中,我最初将变量命名为data 而不是ind,并且我没有在lapply 中更改它。我将编辑我的代码。
      【解决方案3】:

      以下 R 代码针对给定变量(x 或 y 卡方参数保持稳定,明确定义)对每个分类变量/r 数据帧的每个因子运行卡方测试:

      定义你的变量 请 - 将 df$variable1 更改为您想要的因子变量,并将 df 更改为您想要的数据框,其中包含针对给定 df$variable1 测试的所有因子变量

      定义你的数据框 创建一个新的数据框(df2),其中将包含所有卡方值/dfs,给定变量的 p 值与数据框比较

      从 stackoverflow 中的类似帖子创建/完成/更改的代码,都没有产生我想要的结果。 变量与数据框的卡方表统计量 / df / p 值 "2" 参数定义列范围的比较 - 检查应用 (MARGIN) 选项。

      df2 <- t(round(cbind(apply(df, 2, function(x) {
        ch <- chisq.test(df$variable1, x)
        c(unname(ch$statistic), ch$parameter, ch$p.value )})), 3))
      

      【讨论】:

        猜你喜欢
        • 2020-10-12
        • 1970-01-01
        • 2013-11-02
        • 2020-10-03
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 2019-10-04
        • 2020-10-15
        相关资源
        最近更新 更多