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

问题描述

我正在使用 r-exams 编写一些练习,我遇到了这个问题:我正在使用平均中心协变量进行一些简单的线性模型拟合,这是代码

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

简要说明:

  • 名为 call() 的函数的 "lm" 由两个参数 formula =data = 构成。无论如何,公式都是符号的,因此可以计算,并且数据名称 "z0_aw" 被强制为“符号”或“名称”,而不是计算为 data.frame
  • cl$formula 中,我们将符号/名称 m_age 替换为数值 12.679。这是在公式的右侧(第三个元素),在 I() 的参数(第二个元素)中,在差的右侧(第三个元素)。

最后,评估该调用会产生所需的 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