过滤0值并将卡方检验结果输出到R中的数据帧

时间:2017-08-24 21:25:33

标签: r filtering chi-squared

我的数据包含许多案例(超过600个),我有两个独立的评估比较。我想根据观察到的物种的相对丰度来确定评估之间的差异是由于随机变化(不同的地块位置/方法)还是由于人为错误。评估由森林经理(FM;通常是眼睛估计)和负责验证结果的部门(MNRF;基于密集地块的调查)进行。 p值<0.05的结果表明两个样品取自相同群体的可能性极小,或者较不强烈的方法不够准确。

物种组成已根据MNRF建立的地块数量按物种转换为树木数量。可能遇到几种物种,但在每种情况下,通常少于6.通过双字母代码识别物种(例如PJ =杰克松,BW =白桦)。单个案例的一个例子是:

> head(case545)

  Case Source  PJ SB BW PO BF SW PR LA MR CW PW
1  545   MNRF  68 21 17 15  1  0  0  0  0  0  0
2  545     FM 101 13 13  0  0  0  0  0  0  0  0

我可以使用代码计算我想要的统计数据:

chisq.test(rbind(c(68,21,17,15,1),c(101,13,13,0,0)))

我的问题是我有很多案例,我无法弄清楚如何告诉R在每种情况下使用哪些值。据我所知,逻辑流应该是

  1. 识别并消除两个评估值均为0
  2. 的物种
  3. 确保为chisq.test
  4. 正确组织值
  5. 运行测试并输出一个新表格,其中包含每个案例的X2和p值
  6. 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这可能有用,但可能会根据您可能对数据产生的一些细微差别重新进行一些更改。

对于此示例,我使用命名约定caseXXX

重新创建两个案例
case545 <- data.frame(Case="545", 
Source=c("XX","X1"), PJ=c(68,21),SB=c(17,13),BW=c(1,0), SW=c(0,0))
case546 <- data.frame(Case="546",   
Source=c("XX","X1"), PJ=c(100,300),SB=c(0,0),BW=c(400,0), SW=c(300,500))

然后,我们使用该命名约定

创建所有data.frames的列表
library(dplyr)
DF <- ls(pattern = "case")

然后,我们将一个函数应用于data.frames列表,并将这些行绑定在一起以生成一个data.frame。

此功能可以满足您的要求。 1 - 删除只有0的列 2 - 计算统计检验 3 - 给我们X2统计量和p值作为data.frame

Output <- bind_rows(lapply(DF, function(DF){
  TMP <- get(DF)
  TMP <- TMP %>% 
    select(grep(pattern = F,colSums( TMP != 0) == 0))
  TMP <- chisq.test(rbind(TMP[1,-c(1:2)],TMP[2,-c(1:2)]))
  TMP <- data.frame(X2=TMP$statistic,p=TMP$p.value,case=DF)
  return(TMP)
}))

> Output
          X2             p    case
1   4.703423  9.520608e-02 case545
2 550.000000 3.706956e-120 case546