1. 程式人生 > >R語言 | 多元迴歸分析中的對照編碼(contrast coding) | 第一節 dummy variable(啞變數) 和 dummy coding

R語言 | 多元迴歸分析中的對照編碼(contrast coding) | 第一節 dummy variable(啞變數) 和 dummy coding

對於一個自變數是分類變數Categorical Factor的迴歸模型,需要為該Factor的每個Level建立dummy variable。Contrast Matrix把每個Level對映為dummy variable的值。

我們看一個例子來感性認識下dummy variable和contrast matrix。

> 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
我們使用R的dataset包裡的ChickWeight資料集。Diet的Level是1,2,3,4。 建立Weight關於Diet的線性模型,從模型的summary的返回結果來看:
  • 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,並賦值數值,這樣線性模型就能夠計算係數。
那麼,Diet2,Diet3,Diet4的賦值以及其通過建模後得到的係數是怎麼來的呢?R語言通過Contrast Matrix來實現。

函式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的提升。