你在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
从相关矩阵中我们可以看到,变量x1和x2是完全相关的。
为了解决这个错误,我们可以简单地从模型中放弃这两个变量中的一个,因为它们在回归模型中实际上并没有提供独特或独立的信息。
例如,假设我们放弃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