You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot2中对数模型趋势线未贴合数据点的问题解决咨询

问题分析与解决办法

你当前的核心问题是对已经取过自然对数的y值重复做对数变换,导致拟合的模型完全偏离预期,趋势线自然无法贴合数据点。下面分两种场景给出修正方案:

错误原因

你的y轴变量lnCH4_ug_m2_h本身就是原始CH4排放值的自然对数,但代码里却用了log10(y+34)~x,这相当于对ln(CH4)再做一次log10变换,拟合的是log10(ln(CH4)+34) ~ x,这显然不是你想要的对数模型。


场景1:保持y轴为ln(CH4)(当前设置)

如果要拟合原始CH4的指数模型(即ln(CH4) = a + b*x),直接用线性模型拟合即可,因为y已经是对数转换后的值:

p1 <- ggplot(dat, aes(x = T_C_1, y = lnCH4_ug_m2_h))

p2 <- p1 + geom_point(color='grey60') + 
  ggtitle('All Data') +
  xlab('Temperature (°C)') + 
  ylab(expression(ln~CH[4]~(mu*g~m^-2~h^-1))) +
  # 拟合ln(CH4) ~ x,对应原始数据的指数趋势
  geom_smooth(method='lm', aes(color = "Exponential Model"), 
              formula = y~x, size = 1, linetype = 2, se=FALSE) +
  # 若要拟合二次多项式模型(ln(CH4) ~ x + x²)
  geom_smooth(method='lm', aes(color = "Quadratic Model"), 
              formula = y~poly(x,2), size = 1, linetype = 1, se=FALSE) +
  guides(color = guide_legend("Model Type")) +
  theme(axis.line = element_line(colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) 

p2

场景2:切换到原始CH4值的y轴,拟合对数模型

如果你想直接拟合原始CH4的对数模型(即log10(CH4) = a + b*x),需要用原始CH4数据作为y变量,并正确设置模型:

假设你的数据集里有原始CH4排放值列CH4_ug_m2_h:

# 用原始CH4值作为y轴变量
p1 <- ggplot(dat, aes(x = T_C_1, y = CH4_ug_m2_h))

p2 <- p1 + geom_point(color='grey60') + 
  ggtitle('All Data') +
  xlab('Temperature (°C)') + 
  ylab(expression(CH[4]~(mu*g~m^-2~h^-1))) +
  # 拟合log10(CH4) ~ x,趋势线会自动转换为原始值刻度
  geom_smooth(method='lm', aes(color = "Log10 Model"), 
              formula = log10(y)~x, size = 1, linetype = 2, se=FALSE) +
  # 可选:将y轴设为对数刻度,让趋势线显示为线性
  scale_y_log10() +
  guides(color = guide_legend("Model Type")) +
  theme(axis.line = element_line(colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) 

p2

辅助:用AIC选择最优模型

建议先在R中单独拟合所有候选模型,计算AIC后再绘图,这样更准确:

# 拟合不同模型并计算AIC
mod_lm <- lm(lnCH4_ug_m2_h ~ T_C_1, data=dat)
mod_poly2 <- lm(lnCH4_ug_m2_h ~ poly(T_C_1,2), data=dat)
mod_log <- lm(log10(CH4_ug_m2_h) ~ T_C_1, data=dat)

# 查看AIC值(越小模型越优)
AIC(mod_lm, mod_poly2, mod_log)

内容的提问来源于stack exchange,提问作者SoCo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:02:12