R語言 | 多元迴歸分析中的對照編碼(contrast coding) | 第一節 dummy variable(啞變數) 和 dummy coding
阿新 • • 發佈:2019-01-30
對於一個自變數是分類變數Categorical Factor的迴歸模型,需要為該Factor的每個Level建立dummy variable。Contrast Matrix把每個Level對映為dummy variable的值。
那麼這種對dummy variable賦值的編碼方式(即對照矩陣)究竟是什麼意思? 繼續以上述線性模型為例。該模型為 y = aDiet2 + bDiet3+cDiet4+d,其中a,b,c是Diet2,Diet3,Diet4的係數,d是截距。 當Diet=1時,y=d 當Diet=2時,y=aDiet2 + d = a + d 當Diet=3時,y=bDiet3 + d = b + d
當Diet=4時,y=cDiet4+d = c + d 也就是說d就是Diet1,而a、b、c則是Diet2、Diet3、Diet4分別相對於Diet1的偏移。 上述這種對照矩陣稱為treatment,在R語言中,treatment是針對無序的名字型分類變數(nominal factor)的預設contrast。 Treatment又稱為Dummy Coding,首先會選擇一個Level作為參考組(通常是第一個Level作為reference group),然後用剩餘的Level的應變數的均值分別與參考組的應變數的均值來進行比較。 那麼這些係數的含義是什麼? 針對於分類變數(Factor),反應變數(Response Variable,即應變數y)反映了在每個Level下的均值(mean)。 繼續上例,我們計算在每個Level下weight的均值:
然後我們再看回歸模型:weight =102.645 + 19.971Diet2 + 40.305 Diet3 + 32.617Diet4 當Diet = 1時,截距就是weight均值 當Diet = 2時,mean(weight|Diet=2) = 102.645 + 19.971 = 122.6167 ...以此類推 也就是說係數a, b, c就是weight在各個水平下相對於截距的偏移,而這裡截距就是參考組Diet1的weight的均值。 這個係數又稱為效用(Utility),表面給定某Level,會對反應變數的提升(或減少)的幅度。比如,不考慮其他因素,當Diet=2,會對Weight有19.971的提升。
我們看一個例子來感性認識下dummy variable和contrast matrix。
我們使用R的dataset包裡的ChickWeight資料集。Diet的Level是1,2,3,4。 建立Weight關於Diet的線性模型,從模型的summary的返回結果來看:> library(datasets) > str(ChickWeight) Classes ‘nfnGroupedData’, ‘nfGroupedData’, ‘groupedData’ and 'data.frame': 578 obs. of 4 variables: $ weight: num 42 51 59 64 76 93 106 125 149 171 ... $ Time : num 0 2 4 6 8 10 12 14 16 18 ... $ Chick : Ord.factor w/ 50 levels "18"<"16"<"15"<..: 15 15 15 15 15 15 15 15 15 15 ... $ Diet : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ... - attr(*, "formula")=Class 'formula' length 3 weight ~ Time | Chick .. ..- attr(*, ".Environment")= - attr(*, "outer")=Class 'formula' length 2 ~Diet .. ..- attr(*, ".Environment")= - attr(*, "labels")=List of 2 ..$ x: chr "Time" ..$ y: chr "Body weight" - attr(*, "units")=List of 2 ..$ x: chr "(days)" ..$ y: chr "(gm)" > summary(lm(weight~Diet, data=ChickWeight)) Call: lm(formula = weight ~ Diet, data = ChickWeight) Residuals: Min 1Q Median 3Q Max -103.95 -53.65 -13.64 40.38 230.05 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 102.645 4.674 21.961 < 2e-16 *** Diet2 19.971 7.867 2.538 0.0114 * Diet3 40.305 7.867 5.123 4.11e-07 *** Diet4 32.617 7.910 4.123 4.29e-05 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 69.33 on 574 degrees of freedom Multiple R-squared: 0.05348, Adjusted R-squared: 0.04853 F-statistic: 10.81 on 3 and 574 DF, p-value: 6.433e-07
- Intercept是截距
- Diet2是第一個dummy variable。當Diet等於2,那麼Diet2賦值為1,否則為0。以此類推Diet3,Diet4是對應於Level是3或4的dummy variable。
- 對於Diet這一Categorical Variable(Factor),線性模型只能接受數值型變數,所以R會建立Diet2、Diet3、Diet4這幾個dummy variable,並賦值數值,這樣線性模型就能夠計算係數。
函式contrasts用來檢視某個Factor的Contrast Matrix。一般情況下,對於有K個level的Factor,R會建立K-1個dummy variable,另外一個可以通過K-1個dummy variable推匯出來。如下所示,Diet有4個Level(1,2,3,4),所以建立了Diet2,Diet3,Diet4三個變數。R根據這個對照矩陣進行dummy variable的賦值。當Diet=1時,(Diet2,Diet3,Diet4)=(0,0,0);Diet=2,則(Diet2,Diet3,Diet4)=(1,0,0);Diet=3,則(Diet2,Diet3,Diet4)=(0,1,0);當Diet=4,則(Diet2,Diet3,Diet4)=(0,0,1)
> contrasts(ChickWeight$Diet)
2 3 4
1 0 0 0
2 1 0 0
3 0 1 0
4 0 0 1
賦值方法如下data frame所示
Diet | Diet2 | Diet3 | Diet4 |
---|---|---|---|
1 | 0 | 0 | 0 |
2 | 1 | 0 | 0 |
3 | 0 | 1 | 0 |
4 | 0 | 0 | 1 |
那麼這種對dummy variable賦值的編碼方式(即對照矩陣)究竟是什麼意思? 繼續以上述線性模型為例。該模型為 y = aDiet2 + bDiet3+cDiet4+d,其中a,b,c是Diet2,Diet3,Diet4的係數,d是截距。 當Diet=1時,y=d 當Diet=2時,y=aDiet2 + d = a + d 當Diet=3時,y=bDiet3 + d = b + d
當Diet=4時,y=cDiet4+d = c + d 也就是說d就是Diet1,而a、b、c則是Diet2、Diet3、Diet4分別相對於Diet1的偏移。 上述這種對照矩陣稱為treatment,在R語言中,treatment是針對無序的名字型分類變數(nominal factor)的預設contrast。 Treatment又稱為Dummy Coding,首先會選擇一個Level作為參考組(通常是第一個Level作為reference group),然後用剩餘的Level的應變數的均值分別與參考組的應變數的均值來進行比較。 那麼這些係數的含義是什麼? 針對於分類變數(Factor),反應變數(Response Variable,即應變數y)反映了在每個Level下的均值(mean)。 繼續上例,我們計算在每個Level下weight的均值:
> tapply(ChickWeight$weight, ChickWeight$Diet, mean)
1 2 3 4
102.6455 122.6167 142.9500 135.2627
然後我們再看回歸模型:weight =102.645 + 19.971Diet2 + 40.305 Diet3 + 32.617Diet4 當Diet = 1時,截距就是weight均值 當Diet = 2時,mean(weight|Diet=2) = 102.645 + 19.971 = 122.6167 ...以此類推 也就是說係數a, b, c就是weight在各個水平下相對於截距的偏移,而這裡截距就是參考組Diet1的weight的均值。 這個係數又稱為效用(Utility),表面給定某Level,會對反應變數的提升(或減少)的幅度。比如,不考慮其他因素,當Diet=2,會對Weight有19.971的提升。