什么导致了这个错误?由于奇异性未定义系数。

9
我正在尝试为我的数据寻找模型,但是我收到了“系数:(由于奇异性而未定义的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      

我的数据的A-H列包含数值,其余列取0或1,并且我已经检查过没有冲突的值(例如,如果一个案例的春季=1,则秋季=夏季=冬季=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)

我能否请你解释一下这个错误呢?

编辑:在我将数据转换为二进制之前,这是我的数据示例。

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

1
听起来像是多重共线性问题。 - coffeinjunky
3个回答

8
问题是完美共线性。即,
spring + summer + autumn + winter == 1
small + medium + large == 1
low_flow + med_flow + high_flow == 1
Constant term == 1

我指的是这些身份证明对每个观测值都成立。(例如,只有一个季节等于一。)
因此,例如,lm无法区分截距和所有季节效应之和。也许thisthis可以帮助更好地理解这个想法。更具技术性地说,OLS估计涉及某个矩阵,在这种情况下不可逆。
要解决这个问题,您可以运行,例如,
model_1 <- lm(S ~ A + B + C + D + E + F + G + spring + summer + autumn + small + medium + low_flow + med_flow, data = trainOne)

另请参阅此问题


我明白了!我不想放弃变量,因为我必须放弃两个重要的流/大小变量。我最初使用一个包含小、中、大的列“size”,有没有办法保持该列不变,并根据输入分配数值,使该列存储字符“small”和1?从这里开始,我可以对“flow”执行相同的操作,并保留二进制季节变量。 - Laura
@Laura,此时你实际上有太多信息了,通过从方程中删除这三个变量,你不会失去任何东西。我建议阅读这两个参考文献(或许还有其他一些)以了解系数的解释方式。正如@42-所建议的那样,你可能想要添加-1+0来消除截距。在这种情况下,例如spring的系数将相对于省略的winter的影响。(我添加了另一个参考文献。) - Julius Vainora

3
@JuliusVainora已经给出了一个关于错误发生原因的很好的解释,我就不再重复了。然而,Julius的答案只是一种方法,如果你不理解冬季=1、大=1和高流量=1确实有价值的情况,可能并不令人满意。这可以在显示中很容易地看到作为“(Intercept)”的值。通过在公式中添加+0,你可能能够使结果更具可解释性(或者也可能不行,这取决于数据情况)。
然而,我认为你真的应该重新审查一下你对分类变量的编码方式。你正在使用每个级别一个虚拟变量的方法,这可能是从其他系统(比如SAS或SPSS)复制过来的?这将可预见地给你带来问题,并且是一种痛苦的编码和维护方法。R的data.frame函数已经自动创建了将多个级别编码为单个变量的factor。所以你的公式将变成:
 S ~ A + B + C + D + E + F + G + season + size + flow

我认为SAS和可能是SPSS使用了一个系统,其中全局均值被用作参考水平。(对此可能有所错误。自1997年以来就没有使用过它们。)在这种情况下,所有水平的对比系数都会有,但你需要稍微不同地解释这些值。然后,你需要计算系数之间的差异,以得出任何对比的值。通过使用“治疗对比”,系数本身就可以立即解释。

这就是我想要的公式!如何将它们转换为因子(这些存储字符和数字?)我尝试过 modelData$flow <- factor(modelData$flow, ordered = TRUE, levels = c(1,2,3)) 但是我得到了 NA。 - Laura
回答那个问题,我需要看到数据在输入R之前的存在方式以及您所做的转换类型。 - IRTFM
请看我的编辑。我并没有进行“转换”,而是手动创建了变量spring等,并根据季节列分配了0或1。 - Laura
所以你大概做了类似 trainOne <- read.table(file="C:/path/filename", header=TRUE) 的事情。在这种情况下,季节、尺寸和流量变量已经是因子,你不需要进行任何额外的虚拟编码。尝试使用我给出的公式。 - IRTFM
1
实际上,自动创建因子已不再是read.*函数的默认行为。要获取因子,您需要使用factor或设置colClasses。回归函数仍将字符向量视为离散级别,并为您创建正确的因子编码,因此在回归方面的行为保持不变。 - IRTFM
显示剩余2条评论

0

你的一些变量可能是完全共线的。看看这些变量以及它们之间的相关性。你可以使用 cor(dataset) 来检查数据,这将返回你的 dataset 的相关矩阵。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接