R中的lm函数不给出分类数据中所有因子水平的系数

时间:2015-05-11 21:28:13

标签: r linear-regression lm

我正在尝试使用分类属性对R进行线性回归,并观察到我没有得到每个不同因子水平的系数值。

请参阅下面的代码,我有5个状态因子,但只能看到4个系数值。

> states = c("WA","TE","GE","LA","SF")
> population = c(0.5,0.2,0.6,0.7,0.9)
> df = data.frame(states,population)
> df
  states population
1     WA   0.5
2     TE   0.2
3     GE   0.6
4     LA   0.7
5     SF   0.9
> states=NULL
> population=NULL
> lm(formula=population~states,data=df)

Call:
lm(formula = population ~ states, data = df)

Coefficients:
(Intercept)     statesLA     statesSF     statesTE     statesWA  
        0.6          0.1          0.3         -0.4         -0.1

我也通过执行以下操作尝试使用更大的数据集,但仍然看到相同的行为

for(i in 1:10)
{
    df = rbind(df,df)
}
编辑:感谢eipi10,MrFlick和经济方面的回应。我现在明白其中一个级别被用作参考级别。但是当我得到状态值为“GE”的新测试数据时,我如何用等式y = m1x1 + m2x2 + ... + c?

代替

我还尝试将数据平铺,使得每个因子级别都得到它的单独列,但是对于其中一个列,我得到NA作为系数。如果我有一个状态为'WA'的新测试数据,我怎样才能获得'人口价值'?我用什么替代它的系数?

> df1

人口GE MI TE WA     1 1 0 0 0 1     2 2 1 0 0 0     3 2 0 0 1 0     4 1 0 1 0 0

  

lm(公式=人口〜(GE + MI + TE + WA),数据= df1)

Call:
lm(formula = population ~ (GE + MI + TE + WA), data = df1)

Coefficients:
(Intercept)           GE           MI           TE           WA  
          1            1            0            1           NA  

1 个答案:

答案 0 :(得分:5)

GE按字母顺序删除,作为拦截术语。正如eipi10所述,您可以使用states作为基线来解释GE中其他级别的系数(statesLA = 0.1意味着LA平均比GE大0.1倍)。

编辑:

回复您更新的问题:

如果在线性回归中包含所有级别,那么您将会遇到称为完全共线性的情况,这会导致您在将每个类别强制转换为自己的变量时看到的奇怪结果。我不会对此进行解释,只需找到一个维基,并且知道如果变量系数被完全表示(并且你也期望一个截距项)线性回归不起作用。如果你想查看回归中的所有级别,你可以按照评论中的建议执行没有拦截术语的回归,但同样,除非你有特定的理由,否则这是不明智的。

至于GE等式中y=mx+c的解释,您可以通过知道其他状态的等级是二进制(零或一)来计算预期的y,并且如果国家是通用电气,它们都将为零。

e.g。

y = x1b1 + x2b2 + x3b3 + c
y = b1(0) + b2(0) + b3(0) + c
y = c

如果您没有任何其他变量,例如在第一个示例中,GE的效果将等于截距项(0.6)。