在R中修复由于奇异性而无法定义的错误(详细教程)

362 阅读2分钟

你在R中可能遇到的一个错误信息是:

Coefficients: (1 not defined because of singularities) 

当你使用R中的glm()函数拟合一些模型,而你的两个或更多的预测变量之间具有完全的线性关系时,就会出现这个错误信息--这就是所谓的完全多线性关系

为了解决这个错误,你可以使用**cor()**函数来确定你的数据集中哪些变量之间有完全的相关性,并简单地从回归模型中放弃这些变量之一。

本教程分享如何在实践中解决这个错误信息。

如何重现该错误

假设我们在R中对下面的数据框架拟合一个逻辑回归模型

#define data
df <- data.frame(y = c(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1),
                 x1 = c(3, 3, 4, 4, 3, 2, 5, 8, 9, 9, 9, 8, 9, 9, 9),
                 x2 = c(6, 6, 8, 8, 6, 4, 10, 16, 18, 18, 18, 16, 18, 18, 18),
                 x3 = c(4, 7, 7, 3, 8, 9, 9, 8, 7, 8, 9, 4, 9, 10, 13))

#fit logistic regression model
model <- glm(y~x1+x2+x3, data=df, family=binomial)

#view model summary
summary(model)

Call:
glm(formula = y ~ x1 + x2 + x3, family = binomial, data = df)

Deviance Residuals: 
       Min          1Q      Median          3Q         Max  
-1.372e-05  -2.110e-08   2.110e-08   2.110e-08   1.575e-05  

Coefficients: (1 not defined because of singularities)
              Estimate Std. Error z value Pr(>|z|)
(Intercept)    -75.496 176487.031   0.000        1
x1              14.546  24314.459   0.001        1
x2                  NA         NA      NA       NA
x3              -2.258  20119.863   0.000        1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2.0728e+01  on 14  degrees of freedom
Residual deviance: 5.1523e-10  on 12  degrees of freedom
AIC: 6

Number of Fisher Scoring iterations: 24

注意,在系数输出之前,我们收到了这样的信息:

Coefficients: (1 not defined because of singularities)

这表明模型中的两个或多个预测变量具有完美的线性关系,因此模型中的每个回归系数都不能被估计。

例如,注意不能对x2预测变量进行系数估计。

如何处理误差

为了确定哪些预测变量导致了这个错误,我们可以使用cor()函数来产生一个相关矩阵,并检查哪些变量之间的相关性正好为1

#create correlation matrix
cor(df)

           y        x1        x2        x3
y  1.0000000 0.9675325 0.9675325 0.3610320
x1 0.9675325 1.0000000 1.0000000 0.3872889
x2 0.9675325 1.0000000 1.0000000 0.3872889
x3 0.3610320 0.3872889 0.3872889 1.0000000

从相关矩阵中我们可以看到,变量x1x2是完全相关的。

为了解决这个错误,我们可以简单地从模型中放弃这两个变量中的一个,因为它们在回归模型中实际上并没有提供独特或独立的信息。

例如,假设我们放弃X2,并拟合以下逻辑回归模型:

#fit logistic regression model
model <- glm(y~x1+x3, data=df, family=binomial)

#view model summary
summary(model)

Call:
glm(formula = y ~ x1 + x3, family = binomial, data = df)

Deviance Residuals: 
       Min          1Q      Median          3Q         Max  
-1.372e-05  -2.110e-08   2.110e-08   2.110e-08   1.575e-05  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)
(Intercept)    -75.496 176487.031   0.000        1
x1              14.546  24314.459   0.001        1
x3              -2.258  20119.863   0.000        1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2.0728e+01  on 14  degrees of freedom
Residual deviance: 5.1523e-10  on 12  degrees of freedom
AIC: 6

Number of Fisher Scoring iterations: 24

注意,这次我们没有收到 "因奇异性而未定义 "的错误信息。

注意:无论我们放弃x1还是x2都不重要。无论你决定保留哪个变量,最终的模型都将包含相同的系数估计,模型的总体拟合度也将是相同的。

其他资源

下面的教程解释了如何处理R中的其他错误:

如何在R中修复:ExtractVars中无效的模型公式
如何在R中修复:参数不是数字或逻辑:返回na
如何修复:RandomForest.default(m, y, ...) :外来函数调用中的Na/NaN/Inf