Different NA actions for coefficients and summary of linear model in R
在R中,当使用
但是,如果我仅使用
我希望以与打印摘要时包含系数相同的方式提取系数时包含NA。有办法吗?
设置
这里是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | > set.seed(534) > myGroup1 <- factor(c("a","a","a","a","b","b")) > myGroup2 <- factor(c("first","second","first","second","first","first")) > myDepVar <- rnorm(6, 0, 1) > myModel <- lm(myDepVar ~ myGroup1 + myGroup2 + myGroup1:myGroup2) > summary(myModel) Call: lm(formula = myDepVar ~ myGroup1 + myGroup2 + myGroup1:myGroup2) Residuals: 1 2 3 4 5 6 -0.05813 0.55323 0.05813 -0.55323 -0.12192 0.12192 Coefficients: (1 not defined because of singularities) Estimate Std. Error t value Pr(>|t|) (Intercept) -0.15150 0.23249 -0.652 0.561 myGroup11 0.03927 0.23249 0.169 0.877 myGroup21 -0.37273 0.23249 -1.603 0.207 myGroup11:myGroup21 NA NA NA NA Residual standard error: 0.465 on 3 degrees of freedom Multiple R-squared: 0.5605, Adjusted R-squared: 0.2675 F-statistic: 1.913 on 2 and 3 DF, p-value: 0.2914 > coef(summary(myModel)) Estimate Std. Error t value Pr(>|t|) (Intercept) -0.15149826 0.2324894 -0.6516352 0.5611052 myGroup11 0.03926774 0.2324894 0.1689012 0.8766203 myGroup21 -0.37273117 0.2324894 -1.6032180 0.2072173 > summary(myModel)$coefficients Estimate Std. Error t value Pr(>|t|) (Intercept) -0.15149826 0.2324894 -0.6516352 0.5611052 myGroup11 0.03926774 0.2324894 0.1689012 0.8766203 myGroup21 -0.37273117 0.2324894 -1.6032180 0.2072173 |
为什么不从拟合模型中提取系数:
1 2 3 4 5 | > coef(myModel) (Intercept) myGroup1b -0.48496169 -0.07853547 myGroup2second myGroup1b:myGroup2second 0.74546233 NA |
这似乎是最简单的选择。
summary.lm的文档说:"在返回对象中省略了别名系数,但通过打印方法将其恢复了"。似乎没有参数可以控制此省略。除了使用@Gavin Simpson建议的coef(summary(myModel))之外,还有另一种解决方法。您可以创建矩阵
1 2 3 4 5 6 | nr <- num_regressors - nrow(summary(myModel)$coefficients) ##num_regressors shall be defined previously nc <- 4 rnames <- names(which(summary(myModel)$aliased)) cnames <- colnames(summary(myModel)$coefficients) mat_na <- matrix(data = NA,nrow = nr,ncol = nc, dimnames = list(rnames,cnames)) |
然后重新绑定两个矩阵:
1 | mat_coef <- rbind(summary(myModel)$coefficients,mat_na) |
您也可以将汇总拟合表转换为数据框(其中不存在NA变量会丢失):
1 | fit <- as.data.frame(summary(fit)$coefficients) |
然后按名称提取系数:
1 | fit["age","Pr(>|z|)"] |
如果已删除" age ",则尝试从数据框中提取年龄的P值时会得到一个NA