R語言數據分析與挖掘(第五章):方差分析(2)——多因素方差分析
- 2019 年 12 月 16 日
- 筆記
在實際應用中,更多出現的是包含多因素的試驗和處理。多因素試驗與雙因素試驗背後的基本思想是一致的。與單因素方差分析不同,在雙因素方差分析中因素間可能會有交互作用。假設有兩個因素A和B,因素A和B沒有交互作用指的是A的水平值不取決於B的水平值,反之亦然。對於有交互作用的因素,我們不可孤立地看待這些因素。對於雙因素的情形,一般從影像上看,沒有交互作用的因素水平圖表現為兩條不相交的線段,而有交互作用的因素水平圖為兩相交的線段。例如,下圖顯示的是在研究年齡和性別對身高是否有顯著作用過程中,因素年齡與性別之間的交互作用。從影像上看,兩曲線沒有明顯相交,據此可以推測二者間不存在相互作用。當然,要判定是否存在或者不存在交互作用,還需要根據相應的統計量來分析。

如果因素A和B間不存在交互作用,那麼可以對因素A和B各自進行獨立分析,在後續的分析中去除不顯著的因素。如果方差分析的結果顯示因素A和B間存在交互作用,這時候要對數據進行進一步的分析,具體包括:
在因素A的某個水平下,因素B對響應變數的作用。
在因素B的某個水平下,因素A對響應變數的作用。
在所有因素(A,B)的組合中,哪兩組的差異最大。
需要指出的是,多因素的情況與雙因素處理方法類似,只不過分析的因素會增多。
下面以不同劑量下老鼠妊娠重量的差異性分析為例進行介紹。
在R語言中,實現雙因素方差分析的函數與實現單因素方差分析的函數一致,可以實現aov()和anova()函數,不同之處在於模型公式的設定,雙因素方差分析的模型公式應設定為"X~A+B"或"X~A*B"的形式,後者表示考慮因素A與B的交互作用。
下面利用包multcomp中的litter數據集進行操作演練,該數據集是關於老鼠妊娠重量與劑量反應的研究數據,共74個行觀測值和4個變數,列變數包括,劑量等級,共有4個等級,0,5,50和500,妊娠時間,作為協變數共有4個水平,分別是21.5、22、22.5和23;妊娠動物的個數作為協變數;整個妊娠過程中出生的小鼠平均重量,數據的基本情況如下:
> library(multcomp) > data(litter) > dim(litter) [1] 74 4 > head(litter) dose weight gesttime number 1 0 28.05 22.5 15 2 0 33.33 22.5 14 3 0 36.37 22.0 14 4 0 35.52 22.0 13 5 0 36.77 21.5 15 6 0 29.60 23.0 5 > summary(litter) dose weight gesttime number 0 :20 Min. :19.22 Min. :21.50 Min. : 5.00 5 :19 1st Qu.:27.77 1st Qu.:21.50 1st Qu.:12.00 50 :18 Median :30.76 Median :22.00 Median :14.00 500:17 Mean :30.33 Mean :22.09 Mean :13.43 3rd Qu.:33.30 3rd Qu.:22.50 3rd Qu.:15.00 Max. :38.75 Max. :23.00 Max. :17.00 > table(litter$gesttime) 21.5 22 22.5 23 20 24 27 3 > aggregate(litter$weight,by=list(litter$dose),FUN=mean) Group.1 x 1 0 32.30850 2 5 29.30842 3 50 29.86611 4 500 29.64647 > aggregate(litter$weight,by=list(litter$dose),FUN=sd) Group.1 x 1 0 2.695119 2 5 5.092352 3 50 3.762529 4 500 5.404372 > par(mfrow=c(1,2)) > boxplot(weight~dose,data=litter,col=2:5,main="按變數dose分組") > boxplot(weight~gesttime,data=litter,col=2:5,main="按變數gesttime分組")
上述程式碼表示:利用函數summary()對數據集進行描述性統計,發現變數dose的4個不同水平的數量不相等,分別為20、19、18和17;需要注意的是,原始數據中變數gesttime中存儲的數據類型為數值型,故利用函數table()統計該變數4個水平的數據量,發現妊娠時間為21.5、22、22.5和23的老鼠數量分別為20、24、27和30;利用函數aggregate()對變數weight進行分組統計,並計算每-組的均值和方差, 分組依據為變數dose的4個水平,並根據兩個協變數的不同分組繪製變數weight的箱線圖,結果下圖所示。

下面對數據進行方差齊性檢驗,由於原始變數gesttime的數據類型為數值型,在進行方差齊性檢驗的時候需要將其轉化成因子,具體操作如下:
> bartlett.test(weight~as.factor(gesttime),data=litter) Bartlett test of homogeneity of variances data: weight by as.factor(gesttime) Bartlett's K-squared = 0.26778, df = 3, p-value = 0.966 > bartlett.test(weight~dose,data=litter) Bartlett test of homogeneity of variances data: weight by dose Bartlett's K-squared = 9.6497, df = 3, p-value = 0.02179
輸出結果顯示:變數gesttime的值為0.966,大於給定的顯著性水平0.05,故不能拒絕原假設,即認為不同水平下是等方差的,然而dose的p值為0.02179,沒有通過檢驗。接下來對數據進行方差分析,分別按照不考慮gesttime和dose的交互和考慮其交互進行分析。
> fit1<-aov(weight~gesttime+dose,data=litter) > summary(fit1) Df Sum Sq Mean Sq F value Pr(>F) gesttime 1 134.3 134.30 8.049 0.00597 ** dose 3 137.1 45.71 2.739 0.04988 * Residuals 69 1151.3 16.69 --- Signif. codes: 0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1
在不考慮交互作用的情況下,協變數gesttime和dose的檢驗p值均小於給定的顯著水平,故拒絕原假設,即認為變數gesttime和dose對變數weight的影響均顯著的。
> fit2<-aov(weight~gesttime*dose,data=litter) > summary(fit2) Df Sum Sq Mean Sq F value Pr(>F) gesttime 1 134.3 134.30 8.289 0.00537 ** dose 3 137.1 45.71 2.821 0.04556 * gesttime:dose 3 81.9 27.29 1.684 0.17889 Residuals 66 1069.4 16.20 --- Signif. codes: 0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1
上述程式碼表示:在考慮交互作用的情況下進行方差分析,結果顯示,交互作用項的p值為0.17889,大於給定的顯著性水平0.05,故不認為交互項對交量weigh的影響是顯著的,該交互項可以刪除。
交互作用的效果還可以進行可視化展示圖,利用程輯包HH中的函數intrecion2wt()即可,其函數的用法與函數aov()類似,具體操作程式碼如下:
install.packages("HH") library(HH) interaction2wt(weight~gesttime*dose,data=litter)
結果如下圖所示。主要看圖形的第一、四象限的曲線是否存在明顯相交的情況,若存在,則說明兩因素間的交互作用顯著,否則認為不顯著,本圖中第一、四象限的曲線有一定的相交,說明在後續的方差分析中需要添加交互項,但是根據前面的分析結果,交互項並沒有通過檢驗,即交互項的作用並不明顯。
