r-exams下R语言lm均值中心化时如何让summary的Call显示实际数值
实现逻辑说明
lm()输出的Call部分会原样捕获传入函数的初始表达式文本,不会自动对表达式里引用的变量做值替换。想要动态生成公式、同时让Call显示实际的中心化数值,只需要在把公式传给lm()之前,提前把公式里的变量占位符替换为m_age对应的实际计算值即可,整个过程不会改动模型的拟合逻辑和统计结果。
两种可直接落地的实现方案
- 字符串拼接生成公式
利用sprintf把m_age的实际值嵌到公式字符串中,转为公式对象后传入模型:
由于提前已经用# 动态生成嵌入实际均值的公式 form <- as.formula(sprintf("weight ~ I(age - %s)", m_age)) # 拟合模型 m0 <- lm(form, data = z0_aw)m_age <- round(mean(age),4)固定了均值的小数精度,转出的数值格式和手写硬编码值的效果完全一致,调用summary(m0)时,Call部分会直接显示类似lm(formula = weight ~ I(age - 12.679), data = z0_aw)的内容,和硬编码的m1输出完全没有差异。 - 表达式替换生成公式
无需拼接字符串,通过substitute动态替换表达式内的占位符,生成不含原变量名的公式:
这种方法生成的公式对象已经完全替换了原来的# 将公式中的占位符x替换为m_age对应的实际值 m0_formula <- substitute(weight ~ I(age - x), list(x = m_age)) # 拟合模型 m0 <- lm(m0_formula, data = z0_aw)m_age变量名,lm()捕获Call文本时会直接显示替换后的实际数值,拟合结果和其他写法完全一致。
之前尝试的eval写法不生效的原因
直接把eval(m_age)写在公式表达式里时,lm()只会原样捕获你写在公式里的文本片段,不会执行表达式内部的eval逻辑做内容替换,哪怕模型计算的结果正确,Call部分也会固定显示I(age - eval(m_age))的原文。
内容的提问来源于stack exchange,提问作者Nicolas Molano
相关产品推荐
相关产品推荐

