了解GLM中的虚拟(手动或自动)变量创建


13

如果在glm公式中使用了因子变量(例如,具有M和F级的性别),则会创建一个或多个虚拟变量,并且可以在glm模型摘要中找到它们以及相关的系数(例如,genderM)

如果不是代替R以此方式分解因子,而是将因子编码为一系列数字0/1变量(例如,genderM(1表示M,0表示F),genderF(1表示F,0表示0)。 M),然后将这些变量用作glm公式中的数字变量,系数结果会有所不同吗?

基本上,问题是:在使用因子变量和数值变量时,R是否使用不同的系数计算?

后续问题(可能由上述方法回答):除了让R创建虚拟变量的效率高之外,将因子重新编码为一系列数字0,1变量并在模型中使用这些变量是否还有其他问题?


2
系数将相同,R对因子的默认编码与您所描述的完全相同(这称为“虚拟”编码)。如果手动执行此操作,则需要注意“虚拟变量陷阱”-您不能包括所有创建的变量,而只能包括(或者,不包括截距)。否则,您的模型将被过度识别。也有其他编码因子变量的方法。N 1NN1
Affine 2014年

@Affine我的猜测是,如果我同时输入了genderM和genderF,它们中的一个将返回系数的NA(消息是由于奇异而排除了变量)。这是有道理的,因为在这种情况下它们完全线性相关。但是你说我不能把所有的N都包括在内。这是否意味着即使将sexF设置为NA,也将导致性别M系数的差异/问题?或者,更简单地说,如果GLM / LM由于奇异而排除了变量,那么使用过度识别的模型会带来问题吗?(我同意您的观点-只是查询实际问题)
Bryan 2014年

Answers:


22

分类变量(在R中称为“ 因子 ”)需要在多个回归模型中用数字代码表示。有很多可能的方法来适当地构造数字代码(请参阅UCLA的统计信息帮助站点上的此出色列表)。默认情况下,R使用参考级别编码(R称为“ contr。treatment”),这几乎是默认范围内的统计信息。可以使用?options更改整个R会话的所有对比度,也可以使用?contrasts?C(请注意大写)更改特定的分析/变量。如果您需要有关参考级编码的更多信息,请在此处进行解释:例如基于星期几的回归

某些人发现参考级编码令人困惑,您不必使用它。如果需要,可以有两个变量供男性和女性使用。这就是所谓的水平均值编码。但是,如果这样做,则将需要抑制截距,否则模型矩阵将是奇异的,并且回归无法像上面的@Affine注释以及我在这里解释的那样拟合:定性变量编码会导致奇异。要取消拦截,您可以通过添加-1或来修改公式+0y~... -1y~... +0

使用级别表示编码,而不是参考级别编码,将更改估计的系数以及随输出打印的假设检验的含义。当您有两个级别的因子(例如,男性与女性)并且使用参考级别编码时,您将看到被调用的拦截(constant),并且输出中仅列出一个变量(也许sexM)。截距是参考组(也许是女性)sexM的平均值,是男性平均值与女性平均值之间的差。与截距相关的p值是参考水平是否为且与p相关的p值的一样本检验。t0t 0sexM告诉您性别是否对您的反应有所不同。但是,如果您使用水平均值编码,则会列出两个变量,每个p值将对应于该水平的均值是否为本检验。也就是说,所有的p值都不能检验性别是否不同。 t0

set.seed(1)
y    = c(    rnorm(30), rnorm(30, mean=1)         )
sex  = rep(c("Female",  "Male"          ), each=30)
fem  = ifelse(sex=="Female", 1, 0)
male = ifelse(sex=="Male", 1, 0)

ref.level.coding.model   = lm(y~sex)
level.means.coding.model = lm(y~fem+male+0)

summary(ref.level.coding.model)
# ...
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)    
# (Intercept)  0.08246    0.15740   0.524    0.602    
# sexMale      1.05032    0.22260   4.718 1.54e-05 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ...
summary(level.means.coding.model)
# ...
# Coefficients:
#      Estimate Std. Error t value Pr(>|t|)    
# fem   0.08246    0.15740   0.524    0.602    
# male  1.13277    0.15740   7.197 1.37e-09 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ...

1
感谢添加代码:这清楚地证明了参考单元格编码中的截距=单元格中的sex女性意味着编码(我对N-1变量的“发生了什么进一步困惑”……)也许还需要另一个问题,但是使用一个变量很容易理解,那么2或更多呢?例如年龄:“老”“年轻”。在ref单元编码中,是否会显示出sexmale,ageYoung(例如)的系数,而截距会同时显示出sexmale和ageOld?
Bryan 2014年

1
如果您有一个因子w / 3,则截距是参考水平的平均值,另外2将在输出中表示。它们的系数都是b / t与它们的差值,而ref电平和ps则是这些difs的意义。如果您有2个因子,那么两个因子都将具有参考水平,并且截距将是两个参考组中那些人的平均值(例如young F),其他水平将等于给定因子1 w / w的水平。其他因素的参考水平和两个参考水平组。EG oldold F- '年轻˚F , & M`是young M- young F
gung-恢复莫妮卡

1
我对此R^2进行了一些尝试,并在两种方法之间经历了实质性的区别。我知道这只是一个R^2,但是对此有解释吗?
hans0l0

@ hans0l0,我不知道。应该没有区别。
gung-恢复莫妮卡

1
@confused,您可以在文档?glm中找到它。
gung-恢复莫妮卡

2

在您创建与R一致的虚拟变量(即数字变量)的条件下,估计系数将是相同的。例如:让我们创建一个假数据,并使用因数拟合Poisson glm。请注意,该gl函数创建一个因子变量。

> counts <- c(18,17,15,20,10,20,25,13,12)
> outcome <- gl(3,1,9)
> outcome
[1] 1 2 3 1 2 3 1 2 3
Levels: 1 2 3
> class(outcome)
[1] "factor"
> glm.1<- glm(counts ~ outcome, family = poisson())
> summary(glm.1)

Call:
glm(formula = counts ~ outcome, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   3.0445     0.1260  24.165   <2e-16 ***
outcome2     -0.4543     0.2022  -2.247   0.0246 *  
outcome3     -0.2930     0.1927  -1.520   0.1285    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

由于结果具有三个级别,因此我创建了两个虚拟变量(如果dumption = 2则为dummy.1 = 0,如果结果= 3则为dummy.2 = 1),并使用以下数值进行调整:

> dummy.1=rep(0,9)
> dummy.2=rep(0,9)
> dummy.1[outcome==2]=1
> dummy.2[outcome==3]=1
> glm.2<- glm(counts ~ dummy.1+dummy.2, family = poisson())
> summary(glm.2)

Call:
glm(formula = counts ~ dummy.1 + dummy.2, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   3.0445     0.1260  24.165   <2e-16 ***
dummy.1      -0.4543     0.2022  -2.247   0.0246 *  
dummy.2      -0.2930     0.1927  -1.520   0.1285    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

如您所见,估计系数是相同的。但是,如果要获得相同的结果,则在创建虚拟变量时需要小心。例如,如果我创建两个虚拟变量为(如果result = 1,则为dummy.1 = 0;如果结果= 2,则为dummy.2 = 1),则估计结果如下:

> dummy.1=rep(0,9)
> dummy.2=rep(0,9)
> dummy.1[outcome==1]=1
> dummy.2[outcome==2]=1
> glm.3<- glm(counts ~ dummy.1+dummy.2, family = poisson())
> summary(glm.3)

Call:
glm(formula = counts ~ dummy.1 + dummy.2, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   2.7515     0.1459   18.86   <2e-16 ***
dummy.1       0.2930     0.1927    1.52    0.128    
dummy.2      -0.1613     0.2151   -0.75    0.453    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

这是因为,当您outcome在glm.1中添加变量时,R默认情况下会创建两个虚拟变量即outcome2outcome3dummy.1dummy.2glm.2中类似地定义它们,即结果的第一级是将所有其他虚拟变量(outcome2outcome3)设置为零。


感谢您提供估算系数相同的代码证明。创建自己的警告也很有用:我想创建自己的警告,因为这样一来,模型变量将按名称直接绑定到数据库列(这可能对下游有用),但看起来我需要了解如何解决问题我要去做。
Bryan 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.