【问题标题】:What is causing this error? Coefficients not defined because of singularities是什么导致了这个错误?由于奇点而未定义系数
【发布时间】:2019-05-28 01:52:03
【问题描述】:

我正在尝试为我的数据找到一个模型,但我收到消息“系数:(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,并且我检查了没有冲突的值(即,如果一个案例 spring = 1,则 fall=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)

有人能解释一下这个错误吗?

编辑:我将其更改为二进制之前的数据示例

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

【问题讨论】:

  • 对我来说听起来像是多重共线性。

标签: r regression linear-regression


【解决方案1】:

问题是完全共线性。即,

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)

另见this question

【讨论】:

  • 我明白了!我不愿意删除变量,因为我必须删除两个很重要的流量/大小变量。我从包含小中号或大号的列“大小”开始,有没有办法保持该列不变并根据条目分配一个数值,所以该列存储字符“小”和 1?由此我可以对“流动”做同样的事情并保留二元季节变量
  • @Laura,这就是你现在实际上拥有太多信息的重点,并且通过从等式中删除这三个变量,你不会失去任何东西。我建议阅读这两个参考资料(也许还有其他一些参考资料),以了解如何解释系数。正如@42- 所建议的那样,您可能需要添加-1+0 来删除拦截。在这种情况下,例如,spring 的系数将与省略的winter 的影响有关。 (我添加了另一个参考。)
【解决方案2】:

你们中的一些变量可能是完全共线的。看看变量以及它们如何相互关联。您可以使用cor(dataset) 开始检查数据,这将返回您的dataset 的相关矩阵。

【讨论】:

    【解决方案3】:

    @JuliusVainora 已经给你很好的解释了错误是如何发生的,我不再重复。但是,朱利叶斯的回答只是一种方法,如果您不了解 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
    

    【讨论】:

    • 这就是我想要的公式!如何将它们变成因子(这些存储字符和数字?)我尝试过modelData$flow &lt;- factor(modelData$flow, ordered = TRUE, levels = c(1,2,3)),但我得到了 NA
    • 要回答这个问题,我需要看看数据在输入 inot R 之前是如何存在的,以及你做了什么样的转换。
    • 请看我的编辑。我没有像这样“转换”,我手动创建变量 spring 等并根据季节列分配 0 或 1
    • 所以大概你做了类似trainOne &lt;- read.table(file="C:/path/filename", header=TRUE)的事情。在这种情况下,季节、大小和流量变量已经是因素,您不需要进行任何额外的虚拟编码。试试我给出的那个公式。
    • 哦,我不认为 lm 会在非数字上工作......谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2010-10-12
    • 2013-10-03
    • 1970-01-01
    相关资源
    最近更新 更多