问题描述
我正在使用 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