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









你可能感兴趣的:(大数据,数据挖掘,R语言)