R中系数的不同NA作用和线性模型的总结

Different NA actions for coefficients and summary of linear model in R

在R中,当使用lm()时,如果我将调用中的na.action = na.pass设置为lm(),则在汇总表中将存在一个无法估计的系数的NA(在这种情况下,因为缺少单元格) )。

但是,如果我仅使用summary(myModel)$coefficientscoef(summary(myModel))从汇总对象中提取系数,则NA将被省略。

我希望以与打印摘要时包含系数相同的方式提取系数时包含NA。有办法吗?

设置options(na.action = na.pass)似乎无济于事。

这里是一个例子:

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

这似乎是最简单的选择。

na.action与此无关。请注意,您没有在示例中通过na.action = na.pass

na.action是用于处理传递给模型拟合的数据中的NA的全局选项,通常与公式结合使用;它也是函数na.action()的名称。 R通过data自变量和公式中表示的模型的符号表示来构建所谓的模型框架。此时,将检测到任何NA,并且na.action的默认选项是使用na.omit()从数据中删除NA,方法是为任何变量删除带有NA的样本。有其他选择,最有用的是na.exclude(),可以在拟合过程中删除NA,但在拟合值,残差等的正确位置添加NA。请阅读?na.omit?na.action了解更多信息,以及有关此内容的更多信息。


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