R语言绘制GAM模型时输出结果异常报错修复咨询
问题原因
- 初始绘图红线位置完全错误:
predict()使用type = 'terms'参数时,返回的是剔除模型截距的中心化平滑项结果,数值和原始CO2浓度差了截距对应的固定偏移量,所以拟合线会出现在远低于观测散点的位置,和真实拟合结果不符。 - 后续调整出现报错:
preds$fit在type='terms'模式下返回的是矩阵结构而非一维向量,且如果直接在ggplot的aes()中调用外部未和绘图数据绑定的向量,很容易出现长度不匹配、映射关系错乱的报错。
修复方案
直接使用响应尺度预测,将预测结果和原始数据绑定后再绘图即可,完整可运行代码如下:
library(mgcv) library(ggplot2) # 原有模型构建逻辑无需修改 carbonD_model <- gam( co2 ~ s(timeStep, k = 4, bs = "cs"), data = carbonD, family = gaussian(link = "identity") ) # 预测时改用type = "response"直接获取和原始CO2同尺度的拟合值 preds <- predict(carbonD_model, type = "response", se.fit = TRUE) # 将拟合值、置信区间边界合并到原数据中,避免ggplot映射错误 carbonD$pred_fit <- preds$fit carbonD$pred_upper <- preds$fit + 1.96 * preds$se.fit carbonD$pred_lower <- preds$fit - 1.96 * preds$se.fit # 绘图 ggplot(carbonD, aes(x = timeStep)) + geom_point(aes(y = co2), alpha = 0.5) + geom_line(aes(y = pred_fit), color = "red", linewidth = 1) + # 可选添加95%置信区间带 geom_ribbon(aes(ymin = pred_lower, ymax = pred_upper), fill = "red", alpha = 0.2) + labs(x = "时间步长", y = "CO2浓度(ppm)")
补充说明:如果必须使用
type = "terms"的输出结果,需要手动给返回的平滑项加上模型截距才能得到真实拟合值,计算方式为fit = preds$fit[,1] + coef(carbonD_model)[1],否则结果始终是中心化后的偏移值,无法和原始观测匹配。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

