2017-08-24 56 views
0

我有多个包含多个案例(超过600个)的数据,其中有两个独立评估用于比较。我想根据观察到的物种的相对丰度来确定评估之间的差异是否由于随机变化(不同的地块位置/方法)或由于人为错误。评估由森林经理(FM;通常是目测评估)和负责验证结果的部门(MNRF;密集的基于地块的调查)进行。 p值为0.05的结果表明两个样本来自同一群体的可能性不大,或者密集程度较低的方法不够准确。筛选0值并将卡方结果输出到R中的数据框中

根据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 

我可以使用代码计算统计我想这种情况:

​​

我的问题是我有很多很多情况下,我不能图了解如何告诉R在每种情况下使用哪些值。至于我可以告诉逻辑流程应该是

  1. 识别和消除种其中两个评估记录的0
  2. 值确保值被组织为正确chisq.test
  3. 运行测试和输出一个新的表,每个案例的X2和P值

任何帮助,非常感谢。

回答

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 
+0

谢谢!我也想要输出中的自由度,所以我编辑了最后一行: TMP < - data.frame(X2 = TMP $ statistic,d_f = TMP $ parameter,p = TMP $ p.value,case = DF ) –

+0

我的实际数据集有13种可能的种类(大多数都是0)。按照您的建议,我能够生成6个案例(13个变量的2个观察值)。不幸的是,测试运行抛出以下错误 错误select(。,grep(pattern = F,colSums(TMP!= 0)== 0)): 未使用的参数(grep(pattern = F,colSums(TMP!= 0)== 0)) –

+0

有了这段代码,应该不会有数量的物种问题对?)。有没有对任何列进行观察的案例(或源代码组合)? – eclark