我正在尝试使用分类属性对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
答案 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)。