这是我第一次在这里发帖,我希望这一切都在正确的地方。一段时间以来,我一直在使用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
我想确定这个流域中的任何植物物种是否与任何其他物种相关,如果是,那么这是否是正面或负面的关联。要做到这一点,我想对每种物种组合进行卡方检验。我需要为每个物种种类比较创建一个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”循环或“应用”函数的各种方法,但是还没有想到这一点。 我希望这很清楚。这里的任何帮助将不胜感激。我曾尝试在线寻找这个特定问题的现有解决方案,但却找不到任何真正有用的解决方案。如果有人可以将我与现有的答案联系起来,这也很棒。
答案 0 :(得分:1)
您需要combn
函数来查找列的所有组合,然后将它们应用于您的函数,如下所示:
apply(combn(1:ncol(plots), 2), 2, function(ind) CHI(plots[, ind[1]], plots[, ind[2]]))
答案 1 :(得分:1)
我认为你正在寻找这样的东西。我使用了虹膜数据集。
require(datasets)
ind<-combn(NCOL(iris),2)
lapply(1:NCOL(ind), function (i) CHI(iris[,ind[1,i]],iris[,ind[2,i]]))
答案 2 :(得分:1)
以下R代码针对每个分类变量/ r数据帧的每个因子运行chisquare测试,针对给定的变量(x或y chisquare参数保持稳定,明确定义):
定义你的变量 请 - 将df $ variable1更改为您想要的因子变量,将df更改为您想要的数据帧,其中包含针对给定df $ variable1测试的所有因子变量
定义您的Dataframe 创建一个新的数据帧(df2),它将包含给定变量与数据帧比较的所有卡方值/ dfs,p值
从stackoverflow中的类似帖子创建/完成/更改代码,这两者都没有产生我想要的结果。 Chi-Square Tables变量与数据帧的统计/ 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))