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
相关产品推荐
相关产品推荐

