單因素協方差分析是單因素方差分析中包含一個或多個定量的協變量。函數
#multcomp包中litter數據集,懷孕小數分爲四組,每組接受不一樣劑量(0、五、50、500)的要藥物處理。產下幼崽的體重均值爲因變量 #懷孕時長爲協變量 > data(litter, package="multcomp") #注意從包中直接導入數據的方式 > attach(litter) The following objects are masked from litter (pos = 3): dose, gesttime, number, weight > table(dose) #每種劑量下幼崽數並不相同 dose 0 5 50 500 20 19 18 17 > aggregate(weight, by=list(dose), FUN=mean) #求各組的均值 Group.1 x 1 0 32.30850 2 5 29.30842 3 50 29.86611 4 500 29.64647 > fit <- aov(weight ~ gesttime + dose) #擬合模型 > summary(fit) Df Sum Sq Mean Sq F value Pr(>F) gesttime 1 134.3 134.30 8.049 0.00597 ** #ANOCOVA 的 F檢驗代表,懷孕時間與幼崽出生體重相關 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
因爲使用了協變量,可能想獲取調整的組均值,即 去除協變量效應後的組均值。code
可以使用 effects 包中的 effects() 函數來計算調整的均值orm
> library(effects) > effect("dose",fit) dose effect dose 0 5 50 500 32.35367 28.87672 30.56614 29.33460
劑量 F 檢驗雖然代表了不一樣的處理方式對幼崽的體重均值不一樣,但沒法告知咱們哪一種處理方式與其餘方式不一樣,一樣的使用 multcomp包來對全部均值進行成對比(multcomp包還可用來家檢驗用戶自定義的均值假設)ip
#檢驗未用藥條件與其餘三種用藥條件影響是否不一樣感興趣 > library(multcomp) > contrast <- rbind("no drug vs. drug" = c(3,-1,-1,-1)) #注意這裏的設置方式,對照c(3,-1,-1,-1)設定第一組和其餘三組的均值進行比較 > summary(glht(fit,linfct = mcp(dose = contrast))) Simultaneous Tests for General Linear Hypotheses Multiple Comparisons of Means: User-defined Contrasts Fit: aov(formula = weight ~ gesttime + dose) Linear Hypotheses: Estimate Std. Error t value Pr(>|t|) no drug vs. drug == 0 8.284 3.209 2.581 0.012 * #p<0.05顯著,接受H0,獲得未用藥組比其餘用藥條件下的出生體重要高,其餘的對照可用 rbind() 函數添加(詳見help(glht)) --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Adjusted p values reported -- single-step method)
a、與ANOVA相同,都須要驗證變量正態性和方差相同假設,方法都一致it
b、ANOCVA檢驗,還假定迴歸斜率相同,本例中,假定四個處理組經過懷孕時間來預測出生體重的迴歸斜率都相同。table
ANCOVA模型包含懷孕時間*劑量的交互項時,可對 迴歸斜率的同質性進行檢驗。交互效應若顯著,則意味着時間和幼崽出生體重間的關係依賴於藥物劑量的水平ast
#檢驗迴歸斜率的同質性 > library(multcomp) > 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 #交互項 p>0.05不顯著,接受好H0,支持了斜率相等的假設 Residuals 66 1069.4 16.20 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 #斜率相等的假設不成立,能夠嘗試切換協變量或因變量,或使用能對每一個斜率獨立解釋的模型,或使用不須要假設迴歸斜率同質性的非參數ANCOVA方法,sm 包中的 sm.ancova()函數爲後者提供一個例子
HH包中的 ancova() 函數能夠繪製因變量、協變量與因子之間的關係圖form
> library(HH) > ancova(weight ~ gesttime + dose, data=litter) Analysis of Variance Table Response: weight Df Sum Sq Mean Sq F value Pr(>F) gesttime 1 134.30 134.304 8.0493 0.005971 ** dose 3 137.12 45.708 2.7394 0.049883 * Residuals 69 1151.27 16.685 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
從圖可看出,用懷孕時間來預測出生體重的迴歸線性互相平行,只是截距項不一樣。隨着懷孕時間增長,幼崽出生體重也會增長,另外,還能夠看到0劑量截距項最大,5劑量組截距項最小。因爲上面設置的直線會保持平行,若用 ancova(weight ~ gesttime*dose) ,生成的圖形將容許斜率和截距項依據組別而發生變化,這對可視化那些違揹回歸斜率同質性的實例很是有用變量