R语言对数坐标轴下lm()函数拟合结果差异问题咨询
问题根源
系数不匹配的核心原因是对数底数使用不一致:
- 绘图代码中
scale_y_continuous(trans='log10')对y轴做的是以10为底的常用对数转换,stat_poly_line/stat_poly_eq/stat_smooth都会自动沿用这个转换规则,用log10(y)作为响应变量拟合线性模型,因此绘制的直线位置、图上标注的方程都是基于常用对数的正确结果。 - 手动调用
lm()时写的log(mtcars$mpg10),在R中默认计算的是自然对数(底数为e≈2.718),和绘图时的转换规则不统一,算出来的截距、斜率自然和图上标注的方程存在差异。
你看到两条直线视觉上完全重合,是因为根据对数换底公式,不同底数的对数转换只对截距做常数缩放,不会改变线性趋势的相对关系,反变换回原始轴刻度后直线位置完全一致,但系数数值本身存在固定比例差异。
正确实现方法
单模型拟合修正
只要把手动lm中的对数函数换成和坐标轴转换一致的log10()即可,计算出的系数会和stat_poly_eq输出的结果完全匹配:
# 对数底数和ggplot的trans参数保持一致 model <- lm(log10(mpg10) ~ wt, data = mtcars) # 验证系数 summary(model)
批量拟合(适配lmList需求)
nlme::lmList的调用逻辑和普通lm完全一致,只需要保证响应变量的转换规则和坐标轴对数转换完全匹配即可,示例(以mtcars中cyl作为分组变量为例,替换为你自己的分组列即可):
library(nlme) # 按分组批量拟合对数转换后的线性模型 model_list <- lmList(log10(mpg10) ~ wt | cyl, data = mtcars) # 直接提取所有分组的截距、斜率 group_coef <- coef(model_list)
注意:只要坐标轴使用的对数转换规则和模型中响应变量的转换规则一一对应,就不会出现系数不匹配的问题:
trans = "log10"对应模型中写log10(y)trans = "log2"对应模型中写log2(y)trans = "log"(自然对数) 对应模型中写log(y)
内容的提问来源于stack exchange,提问作者Vistho
相关产品推荐
相关产品推荐

