> library(multcomp) > attach(cholesterol) > table(trt) trt 1time 2times 4times drugD drugE 10 10 10 10 10 > aggregate(response,by=list(trt),FUN=mean) #求各組均值 Group.1 x 1 1time 5.78197 2 2times 9.22497 3 4times 12.37478 4 drugD 15.36117 5 drugE 20.94752 > aggregate(response,by=list(trt),FUN=sd) #求各組標準差 Group.1 x 1 1time 2.878113 2 2times 3.483054 3 4times 2.923119 4 drugD 3.454636 5 drugE 3.345003 > fit <- aov(response ~ trt) #檢測組間差別 > summary(fit) Df Sum Sq Mean Sq F value Pr(>F) trt 4 1351.4 337.8 32.43 9.82e-13 *** #Anova對治療方式(trt)的F檢驗很是顯著(p<0.0001),說明五種療法的效果不一樣 Residuals 45 468.8 10.4 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 #gplots包中的plotmeans()可用來繪製帶有置信區間的組均值圖形 > library(gplots) > plotmeans(response ~ trt,xlab="Treatment",ylab="Response",main="Mean Plot\nwith 95% CI") > detach(cholesterol)
雖然ANOVA對各療法的 F 檢驗代表五種藥物治療效果不一樣,可是並無告訴你哪一種療法與其餘療法不一樣,多重比較能夠解決這個問題ide
##TukeyHSD()函數提供了對各組均值差別的成對檢驗 > TukeyHSD(fit) Tukey multiple comparisons of means 95% family-wise confidence level Fit: aov(formula = response ~ trt) $trt diff lwr upr p adj 2times-1time 3.44300 -0.6582817 7.544282 0.1380949 #均值差別不顯著(p=0.138) 4times-1time 6.59281 2.4915283 10.694092 0.0003542 #差別很是顯著 drugD-1time 9.57920 5.4779183 13.680482 0.0000003 drugE-1time 15.16555 11.0642683 19.266832 0.0000000 4times-2times 3.14981 -0.9514717 7.251092 0.2050382 drugD-2times 6.13620 2.0349183 10.237482 0.0009611 drugE-2times 11.72255 7.6212683 15.823832 0.0000000 drugD-4times 2.98639 -1.1148917 7.087672 0.2512446 drugE-4times 8.57274 4.4714583 12.674022 0.0000037 drugE-drugD 5.58635 1.4850683 9.687632 0.0030633 > par(las=2) #旋轉軸標籤 > par(mar=c(5,8,4,2)) #增大左邊界的面積,可以使標籤擺放更美觀 > plot(TukeyHSD(fit)) #圖形中置信包含 0 的療法說明差別不線顯著(p>0.5) > par(opar) Hit <Return> to see next plot: par(opar)
multcomp包中 glht() 函數提供了多重均值比較更爲全面的方法,既適用於線性模型(如本章各例),也適用於廣義線性模型,下面的代碼重現了 Tukey HSD 檢驗,並用不一樣的圖形對結果進行展現函數
> library(multcomp) > par(mar=c(5,4,6,2)) #增大頂部邊界面積 > tuk <- glht(fit, linfct=mcp(trt="Tukey")) > plot(cld(tuk, level=.05),col="lightgrey") > par(opar)
1time 和 2itme差別不顯著(有相同的字母a),2times和 4times差別也不顯著(有相同的字母b),而 1time 和 4time 差別顯著(沒有共同的字母)spa
從結果來看,使下降膽固醇的藥物時,一天四次 5mg 劑量比一天一次 20m 劑量效果更佳,也優於候選藥物 drugD ,但藥物 drugE 比其餘的全部藥物和療法都更優code
作單因素方差分析時,咱們假設統計檢驗的數據是知足假設條件:假設因變量服從正態分佈,各組方差相等orm
使用Q-Q圖來檢驗正態性假設ip
#檢驗因變量服從正態分佈 > library(car) > qqPlot(lm(response ~ trt, data=cholesterol), + simulate=TRUE, main="Q-Q Plot", labels=FALSE) Hit <Return> to see next plot:
注意qqPlot()要求 lm() 擬合。如上圖數據落在 95% 的置信區間範圍內,說明知足正態性假設。it
Bartlett檢驗table
> bartlett.test(response ~ trt, data=cholesterol) Bartlett test of homogeneity of variances data: response by trt Bartlett's K-squared = 0.5797, df = 4, p-value = 0.9653 # p=0.97 > α 因此接受 H0 方差並無顯著的不一樣 #其餘的檢驗 Fligner-Killeen檢驗(flingner.test())和Brown-Forsythe檢驗(HH包中的hov()函數),結果與 Bartlett 檢驗相同
方差齊性檢驗對離羣點很是敏感,可利用 car 包中 outlierTest() 來檢驗離羣點form
> library(car) > outlierTest(fit) No Studentized residuals with Bonferonni p < 0.05 Largest |rstudent|: rstudent unadjusted p-value Bonferonni p 19 2.251149 0.029422 NA #從輸出的結果來看,並無證聽說明膽固醇數據中含有離羣點(當p>1時產生NA)。所以 Q-Q圖,Bartlett檢驗和離羣點檢驗,該數據彷佛能夠用ANOVA模型擬合的很好。