在R中,当使用lm()
时,如果我在na.action = na.pass
的调用中设置了lm()
,那么在摘要表中,对于任何无法估计的系数都有一个NA(因为在这种情况下丢失的细胞)。
但是,如果我只使用summary(myModel)$coefficients
或coef(summary(myModel))
从摘要对象中提取系数,则省略NA。
我希望在我提取系数时包含NA,就像我打印摘要时包含的系数一样。有没有办法做到这一点?
设置options(na.action = na.pass)
似乎没有帮助。
以下是一个例子:
> 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
答案 0 :(得分:2)
为什么不从拟合模型中提取系数:
> coef(myModel)
(Intercept) myGroup1b
-0.48496169 -0.07853547
myGroup2second myGroup1b:myGroup2second
0.74546233 NA
这似乎是最简单的选择。
na.action
与此无关。请注意,您的示例中没有传递na.action = na.pass
。
na.action
是一个全局选项,用于处理传递给模型拟合的数据中的NA
,通常与公式一起使用;它也是函数na.action()
的名称。 R从data
参数和公式中表示的模型的符号表示构建所谓的模型框架。此时,将检测到任何NA
,na.action
的默认选项是使用na.omit()
通过删除{{1}的样本来从数据中删除NA
对于任何变量。有一些替代方案,最有用的是NA
,它们会在拟合过程中删除na.exclude()
,但会在拟合值,残差等的正确位置添加NA
。阅读NA
和{ {1}}了解详情,加上?na.omit
了解更多信息。
答案 1 :(得分:1)
summary.lm的文档说'返回对象中省略了别名系数,但是通过 print 方法'恢复了。似乎没有参数来控制这个省略。除了使用@gavin Simpson建议的coef(summary(myModel))之外还有另外一项工作。您可以创建矩阵
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))
然后再绑定两个矩阵:
mat_coef <- rbind(summary(myModel)$coefficients,mat_na)
答案 2 :(得分:0)
您还可以将汇总拟合表转换为数据框(其中NA变量丢失):
fit <- as.data.frame(summary(fit)$coefficients)
然后按名称提取系数:
fit["age", "Pr(>|z|)"]
如果已删除“年龄”,则在尝试从数据框中提取年龄的P值时会得到一个不适用