Lau*_*ura 8 regression r linear-regression
我正在尝试为我的数据找到一个模型,但是我得到的信息是"系数:(3由于奇点而没有定义)"这些在冬天,大和高流出现
我发现了这个:https: //stats.stackexchange.com/questions/13465/how-to-deal-with-an-error-such-as-coefficients-14-not-defined-because-of-singu
它说它可能是不正确的虚拟变量,但我检查过我的列都没有重复.
当我使用函数alias()时,我得到:
Model :
S ~ A + B + C + D + E + F + G + spring + summer + autumn + winter + small + medium + large + low_flow + med_flow + high_flow
Complete :
(Intercept) A B C D E F G spring summer autumn small medium
winter 1 0 0 0 0 0 0 0 -1 -1 -1 0 0
large 1 0 0 0 0 0 0 0 0 0 0 -1 -1
high_flow 1 0 0 0 0 0 0 0 0 0 0 0 0
low_flow med_flow
winter 0 0
large 0 0
high_flow -1 -1
Run Code Online (Sandbox Code Playgroud)
我的数据的AH列包含数值,其余列取0或1,我检查过没有冲突的值(例如,如果一个案例的spring = 1,则autumn = summer = winter = 0)
model_1 <- lm(S ~ A+B+C+D+E+F+G+spring+summer+autumn+winter+small+medium+large+low_flow+med_flow+high_flow, data = trainOne)
summary(model_1)
Run Code Online (Sandbox Code Playgroud)
有人可以解释这个错误吗?
编辑:我将数据更改为二进制之前的数据示例
season size flow A B C D E F G S
spring small medium 52 72 134 48 114 114 142 11
autumn small medium 43 21 98 165 108 23 60 31
spring medium medium 41 45 161 86 177 145 32 12
autumn large medium 40 86 132 80 82 138 186 16
winter medium high 49 32 147 189 125 43 144 67
summer large high 43 9 158 64 14 146 15 71
Run Code Online (Sandbox Code Playgroud)
问题是完美的共线性.也就是说,
spring + summer + autumn + winter == 1
small + medium + large == 1
low_flow + med_flow + high_flow == 1
Constant term == 1
Run Code Online (Sandbox Code Playgroud)
我的意思是,这些身份对每个观察都是独立的.(例如,只有一个季节等于一个.)
因此,例如,lm无法区分截距和所有季节效果的总和.也许这或那将有助于更好地理解这个想法.在技术上,OLS估计涉及在这种情况下不可逆的某个矩阵.
要解决此问题,您可以运行,例如,
model_1 <- lm(S ~ A + B + C + D + E + F + G + spring + summer + autumn + small + medium + low_flow + med_flow, data = trainOne)
Run Code Online (Sandbox Code Playgroud)
另见这个问题.
@JuliusVainora 已经给你很好的解释了错误是如何发生的,我不会重复。然而,Julius 的答案只是一种方法,如果您不明白在 Winter = 1、large=1 和 high_flow=1 的情况下确实存在价值,则可能不会令人满意。它可以很容易地在显示屏中看到为“(截距)”的值。+0通过添加到公式中,您也许可以使结果更易于解释。(也可能不会,具体取决于数据情况。)
但是,我认为您确实应该重新检查分类变量的编码是如何完成的。您正在使用一种从其他系统(可能是 SAS 或 SPSS)复制的每个级别一个虚拟变量的方法?可以预见的是,这将会在未来给你带来问题,并且成为一种痛苦的编码和维护方法。R 的 data.frame 函数已经自动创建了factor在单个变量中编码多个级别的 。(阅读?factor。)所以你的公式将变成:
S ~ A + B + C + D + E + F + G + season + size + flow
Run Code Online (Sandbox Code Playgroud)
我认为 SAS 或许还有 SPSS 使用的系统将全局平均值用作参考水平。(这可能是错误的。自 1997 年以来就没有使用过它们。)在这种情况下,所有级别的对比度都会有系数,但您需要对这些值进行稍微不同的解释。然后,您需要计算系数差异以获得任何对比度的值。通过使用“治疗对比”,系数本身可以立即解释。