2017-08-24 55 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