lm 中的均值居中协变量和显示实际平均值的摘要打印

Mean centered covariate in lm and summary printing showing actual mean value

我正在使用 r-exams 编写一些练习,然后我开始解决这个问题:我正在使用均值中心协变量进行一些简单的线性模型拟合,代码如下:

## DATA GENERATION
set.seed(123)
n<-rpois(1,120)
age<-runif(n,0,25)
m_age<-round(mean(age),4)
wght<-100+.8*age+rnorm(n,0,4)

z0_aw<-data.frame(age,weight=wght)

m0<-lm(weight~I(age-m_age),data=z0_aw)
summary(m0)
#> 
#> Call:
#> lm(formula = weight ~ I(age - m_age), data = z0_aw)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -9.2226 -2.4603 -0.2445  2.3565 13.0428 
#> 
#> Coefficients:
#>                 Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)    110.02678    0.36571  300.86   <2e-16 ***
#> I(age - m_age)   0.78432    0.05069   15.47   <2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 3.888 on 111 degrees of freedom
#> Multiple R-squared:  0.6832, Adjusted R-squared:  0.6804 
#> F-statistic: 239.4 on 1 and 111 DF,  p-value: < 2.2e-16

m1<-lm(weight~I(age-12.679),data=z0_aw)
summary(m1)
#> 
#> Call:
#> lm(formula = weight ~ I(age - 12.679), data = z0_aw)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -9.2226 -2.4603 -0.2445  2.3565 13.0428 
#> 
#> Coefficients:
#>                  Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)     110.02678    0.36571  300.86   <2e-16 ***
#> I(age - 12.679)   0.78432    0.05069   15.47   <2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 3.888 on 111 degrees of freedom
#> Multiple R-squared:  0.6832, Adjusted R-squared:  0.6804 
#> F-statistic: 239.4 on 1 and 111 DF,  p-value: < 2.2e-16

reprex package (v0.3.0)

于 2021 年 2 月 14 日创建

如您所见,模型 m0 摘要中调用的输出是 lm(formula = weight ~ I(age - m_age), data = z0_aw)

我想获得与模型 m1 相同的输出,即 lm(formula = weight ~ I(age - 12.679), data = z0_aw)

但是,绝对需要使用对象 m_age,因为练习是随机生成的,以避免考试作弊。我只是尝试了 lm(weight~I(age-eval(m_age)),data=z0_aw) 之类的东西,但是摘要调用的输出是 lm(formula = weight ~ I(age - eval(m_age)), data = z0_aw)

对我来说实现输出lm(formula = weight ~ I(age - 12.679), data = z0_aw)非常重要,因为它会在一些问题中使用。

而不是 eval(m_age) 我会建立整个 lm() 的调用,然后只用它的值替换 m_age。您可以通过以下方式进行:

cl <- call("lm", formula = weight ~ I(age - m_age), data = as.name("z0_aw"))
cl$formula[[3]][[2]][[3]] <- m_age
cl
## lm(formula = weight ~ I(age - 12.679), data = z0_aw)

作为简要说明:

  • 名为 "lm" 的函数的 call() 是用两个参数 formula =data = 构造的。该公式无论如何都是符号的,因此可以被评估,数据名称 "z0_aw" 被强制转换为“符号”或“名称”,而不是被评估为 data.frame.
  • cl$formula 中,我们将 symbol/name m_age 替换为数值 12.679。这是在公式的右侧(第 3 个元素),在 I() 的参数中(第 2 个元素),在差值的右侧(第 3 个元素)。

最后,评估该调用会产生所需的 lm 对象:

m <- eval(cl)
summary(m)
## Call:
## lm(formula = weight ~ I(age - 12.679), data = z0_aw)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.2226 -2.4603 -0.2445  2.3565 13.0428 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     110.02678    0.36571  300.86   <2e-16 ***
## I(age - 12.679)   0.78432    0.05069   15.47   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.888 on 111 degrees of freedom
## Multiple R-squared:  0.6832, Adjusted R-squared:  0.6804 
## F-statistic: 239.4 on 1 and 111 DF,  p-value: < 2.2e-16