在R中对数据框中所有列的组合进行独立性卡方检验

6
这是我第一次在这里发布帖子,希望这个地方是正确的。我已经使用R进行基本的统计分析一段时间了,但实际上还没有将其用于任何计算挑战,并且在R的编程/数据操作方面我还是一个初学者。
我有72种植物物种在单个集水区的323个样地中的存在/缺失(二进制)数据。数据框是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

现在我正在尝试找到一种方法,将此函数应用于数据框中的每个物种组合。 我希望R将每一列取出,将CHI函数依次应用于该列和其他列,然后依此类推通过所有列,从数据框中减去每一列,这样就不会测试相同的物种对两次。 我已经尝试过使用“for”循环或“apply”函数的各种方法,但还没有能够解决这个问题。
我希望这足够清楚。 在这里的任何帮助都将不胜感激。 我已经尝试寻找在线上现有的解决方案,但还没有找到真正有帮助的。 如果有人可以链接给我一个现有的答案,那也太好了。
3个回答

2
您需要使用combn函数来找到所有列的组合,然后将它们应用到您的函数中,类似于以下代码:
apply(combn(1:ncol(plots), 2), 2, function(ind) CHI(plots[, ind[1]], plots[, ind[2]]))

1
我认为你正在寻找类似于这样的东西。我使用了鸢尾花数据集。
require(datasets)
ind<-combn(NCOL(iris),2)
lapply(1:NCOL(ind), function (i) CHI(iris[,ind[1,i]],iris[,ind[2,i]]))

@Psidom,你真的很快;抱歉,我无法删除我的答案,因为没有删除按钮。这会教会我在发布前刷新。 - Jeonifer
非常感谢您的帮助!我尝试使用以下代码处理我的数据:> plotc <- combn(NCOL(plots),2) > > 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 这将返回单个输出。我想要输出每个组合表中每个元素的卡方检验结果,很抱歉,在我的原始问题中可能没有表达清楚。您知道如何实现这一点吗?再次感谢。 - YJS
你在代码中指定只输出一个结果。如果你想要全部结果,删除代码末尾的 [[1]],并将代码改为 plotc <- combn(NCOL(plots),2); lapply(1:NCOL(data), function (i) CHI(plots[,plotc[1,i]],plots[,plotc[2,i]])) - Jeonifer
我看到问题所在了,将NCOL(data)改为NCOL(plotc)。在我的代码中,我最初将变量命名为data而不是ind,并且我没有在lapply中更改它。我会编辑我的代码。 - Jeonifer
尝试按照您描述的方式更改CHI函数,仍然得到一个长度为10的列表。非常奇怪... - YJS
显示剩余5条评论

1
以下R代码对一个r数据框中的每个分类变量/因子运行卡方检验,针对给定的变量进行测试(x或y卡方参数保持稳定,明确定义):
定义你的变量 请将df$variable1更改为您所需的因子变量,并将df更改为包含所有要测试的因子变量与给定df$variable1相比较的可取数据框。
定义你的数据框 创建一个新的数据框(df2),它将包含给定变量与数据框比较的所有卡方值/ df,p值
代码从stackoverflow的类似帖子中创建/完成/修改,但没有产生我想要的结果。 变量与数据框的卡方表统计量/ df / p值 “2”参数定义列广泛比较-检查apply(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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接