2016-11-08 214 views
0

我有三個列在數據框沙丘(下面 - 頁面底部)描述marram草覆蓋%三種不同的沙丘生態系統:R:單向Anova和配對post hoc測試(土耳其,Scheffe或其他)數值列

(1)恢復; (2)降解;和 (3)自然;

我已經執行了兩種不同的單向Anova測試(如下) - 測試1和測試2 - 在生態系統之間建立顯着差異。測試1清楚地表明生態系統之間的顯着差異;然而,測試2顯示沒有顯着差異。箱形圖(下圖)顯示了生態系統之間差異的明顯差異。

之後,我熔化了數據框以生成一個也是響應變量的階乘列(即Ecosystem.Type)。這個想法是應用glm模型(測試3 - 下面)來測試單向Anova;但是,此方法不成功(請在下面找到錯誤消息)。

問題

我很困惑我的代碼是否執行每一個單因素方差分析測試是正確的,正確的程序來進行事後檢驗(土耳其HSD,薛費或其他)來區分對那些生態系統明顯不同。如果有人能幫助,我會非常感謝你的建議。非常感謝....

data(dune) 

測試1

dune.type.1<-aov(Natural~Restored+Degraded, data=dune) 
summary.aov(dune.type.1, intercept=T) 

       Df Sum Sq Mean Sq F value Pr(>F)  
    (Intercept) 1 34694 34694 138.679 1.34e-09 *** 
    Restored  1  94  94 0.375 0.548  
    Degraded  1 486  486 1.942 0.181  
    Residuals 17 4253  250      
      --- 
    Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

事後檢驗的

posthoc<-TukeyHSD(dune.type.1, conf.level=0.95) 

    Error in TukeyHSD.aov(dune.type.1, conf.level = 0.95) : 

    no factors in the fitted model 

    In addition: Warning messages: 
    1: In replications(paste("~", xx), data = mf) : 
     non-factors ignored: Restored 
    2: In replications(paste("~", xx), data = mf) : 
     non-factors ignored: Degraded 

測試2

 dune1<-aov(Restored~Natural, data=dune) 
    dune2<-aov(Restored~Degraded, data=dune) 
    dune3<-aov(Degraded~Natural, data=dune) 

    summary(dune1) 

       Df Sum Sq Mean Sq F value Pr(>F) 
    Natural  1  86 85.58 0.356 0.558 
    Residuals 18 4325 240.26    

    summary(dune2) 

       Df Sum Sq Mean Sq F value Pr(>F) 
    Degraded  1 160 159.7 0.676 0.422 
    Residuals 18 4250 236.1    

    summary(dune3) 

       Df Sum Sq Mean Sq F value Pr(>F) 
    Natural  1 168.5 168.49 2.318 0.145 
    Residuals 18 1308.5 72.69 

試驗3

melt.dune<-melt(dune, measure.vars=c("Degraded", "Restored", "Natural")) 


colnames(melt.dune)=c("Ecosystem.Type", "Percentage.cover") 
melt.dune$Percentage.cover<-as.numeric(melt.dune$Percentage.cover) 

glm.dune<-glm(Ecosystem.Type~Percentage.cover, data=melt.dune) 
summary(glm.dune) 

Error 

glm.dune<-glm(Ecosystem.Type~Percentage.cover, data=melt.dune) 
Error in glm.fit(x = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, : 
NA/NaN/Inf in 'y' 
In addition: Warning messages: 
1: In Ops.factor(y, mu) : ‘-’ not meaningful for factors 
2: In Ops.factor(eta, offset) : ‘-’ not meaningful for factors 
3: In Ops.factor(y, mu) : ‘-’ not meaningful for factors 

熔數據幀

structure(list(Ecosystem.Type = structure(c(1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("Degraded", "Restored", 
"Natural"), class = "factor"), Percentage.cover = c(12, 17, 21, 
11, 22, 16, 7, 9, 14, 2, 3, 15, 23, 4, 19, 36, 26, 4, 15, 23, 
38, 46, 65, 35, 54, 29, 48, 13, 19, 33, 37, 55, 11, 53, 13, 24, 
28, 44, 42, 39, 18, 61, 31, 46, 51, 51, 41, 44, 55, 47, 73, 43, 
25, 42, 21, 13, 65, 30, 47, 29)), row.names = c(NA, -60L), .Names =   c("Ecosystem.Type", 
"Percentage.cover"), class = "data.frame") 

enter image description here

數據

structure(list(Degraded = c(12L, 17L, 21L, 11L, 22L, 16L, 7L, 
9L, 14L, 2L, 3L, 15L, 23L, 4L, 19L, 36L, 26L, 4L, 15L, 23L), 
Restored = c(38L, 46L, 65L, 35L, 54L, 29L, 48L, 13L, 19L, 
33L, 37L, 55L, 11L, 53L, 13L, 24L, 28L, 44L, 42L, 39L), Natural = c(18L, 
61L, 31L, 46L, 51L, 51L, 41L, 44L, 55L, 47L, 73L, 43L, 25L, 
42L, 21L, 13L, 65L, 30L, 47L, 29L)), .Names = c("Degraded", 
"Restored", "Natural"), class = "data.frame", row.names = c(NA, 
-20L)) 
+0

1)爲了有一個因素列機智'melt'您data.frame h水平退化,恢復,自然。這是這些功能期望的數據形狀。 2.)作爲依賴的百分比違反了「aov」的假設。你應該使用GLM。 – Roland

+0

嗨,羅蘭,謝謝你的建議。我融化了數據框(請在上面找到)並製作了glm模型;但是,我遇到了錯誤消息(也在上面)。你有什麼建議如何解決這個錯誤。非常感謝您的幫助。 –

回答

1

我想指出幾件事情。

首先,測試1和測試2產生類似的結果。唯一的區別是你在測試1上選擇了一個截距,因此結果告訴你,如果你符合一個線性模型(我會在幾分鐘內得出結論),截取是必需的。因此,您所看到的重要性是您強制適合的線是否需要攔截。嘗試使用「攔截= T」的其他結果,我很肯定你會得到類似的結果。

您應該注意的第二件事是關於您嘗試適合的線性模型。 dune.type.1模型是您真正瞭解不同沙丘生態系統相關性的模型。換句話說,你認爲自然和恢復之間存在線性關聯,隨着恢復的每增加一個單位,你的自然就會有一些增加。如果我正確理解你想要的是檢查平均差異而不是它們的相關性。因此,你可以做兩件事:

  1. 數據準備執行t.tests(比較幾個類別之間的平均值的測試)。在R中很容易做,因爲所有的變量都是合理正常的。但是,您將有多個測試問題(您將執行大概3次t檢驗以獲得所有差異),因此需要使用Bonferroni校正。

  2. 但我認爲你真正想要的是以下幾點:

第一次改革中的數據

 data <- data.frame(v = c(dune$Degraded, dune$Restored, dune$Natural), 
        labels = c(rep("Degraded", times = 20), rep("Restored", times = 20), 
           rep("Natural", times = 20))) 

然後適應線性模型

mod.1 <- lm(v ~ labels, data = data) 
    summary(mod.1) 
    lm(formula = v ~ labels, data = data) 

Residuals: 
Min  1Q Median  3Q  Max 
-28.650 -10.725 0.875 8.050 31.350 

Coefficients: 
       Estimate Std. Error t value Pr(>|t|)  
(Intercept)  14.950  3.066 4.875 9.07e-06 *** 
labelsNatural 26.700  4.337 6.157 7.95e-08 *** 
labelsRestored 21.350  4.337 4.923 7.64e-06 *** 

在那裏你可以真正看到基線類別(即退化)的平均值與平均值相比要小得多自然類等,你也可以檢查模型假設,看看你的模型是一個不錯的選擇

qqnorm(residuals(mod.1)) 
    qqline(residuals(mod.1)) 

enter image description here 他們殘差是合理正常的,因此模型是好的。您也可以按照你的方差分析方法,並具有:

anova.model <- aov(v ~ labels, data = data)) 
    summary(anova.model) 

      Df Sum Sq Mean Sq F value Pr(>F)  
labels  2 7982 3991 21.22 1.29e-07 *** 
Residuals 57 10720  188 

這表明有沙丘生態系統的裝置之間至少一個顯著的差異,並按照與杜克的逐點間隔:

post <- TukeyHSD(aov(v ~ labels, data = data)) 
    plot(post, ylim = c(0, 4)) 

enter image description here

已經調整了多個測試:)

+0

謝謝Akis,這個解釋和代碼太棒了!這是深深的讚賞。我繪製了事後檢驗的結果,在圖上只有兩個成對的標籤。如何解決它的任何建議.........謝謝,並再次感謝你:) –

+0

嘗試在陰謀功能ylim玩。在我的例子中,我使用了ylim = c(0,4),所以我可以清楚地看到成對差異的所有三個置信區間 – Akis