如何基于glm预测值在ggplot中添加回归线
问题根因
geom_smooth()的调用逻辑错误:该图层本身的作用是根据传入的原始数据、指定的模型自动完成拟合+绘图,不需要提前用predict()计算预测值再传入- 代码里
data$列名的写法不符合ggplot的映射逻辑,ggplot默认从ggplot(data=xx)传入的全局数据中调取列,额外加数据集前缀很容易出现变量长度不匹配的问题 - 缺失值警告是因为原始数据集里有2行同时存在 predictor1/predictor2/响应变量的缺失值,拟合时会被自动剔除
正确实现方案
分为两种场景按需选择:
方案1:使用提前计算好的预测值绘图
如果已经通过predict()得到了预测结果,直接用geom_line()绘制即可,不需要调用geom_smooth():
- 先将预测值合并到数据集(如果要画平滑的回归线,建议单独生成预测用的均匀自变量序列,避免原数据自变量取值零散导致线不连贯)
# 假设原数据集为df,拟合好的回归模型为model # 生成用于预测的标准化数据集:predictor1取原数据范围内的100个均匀值,predictor2固定为均值(也可按需固定为中位数等其他定值) new_df <- data.frame( predictor1 = seq(min(df$predictor1, na.rm = TRUE), max(df$predictor1, na.rm = TRUE), length.out = 100), predictor2 = mean(df$predictor2, na.rm = TRUE) ) # 计算对应预测值 new_df$predicted.values <- predict(model, newdata = new_df)
- 绘图时单独指定线图层的数据源
ggplot(df, aes(x = predictor1, y = 响应变量)) + geom_point(na.rm = TRUE) + # na.rm=TRUE可以跳过缺失值警告 geom_line(data = new_df, aes(y = predicted.values), color = "red", linewidth = 1)
方案2:直接用geom_smooth完成双变量回归拟合
不需要提前计算预测值,直接在geom_smooth()里指定模型和公式即可得到完全一致的回归线:
ggplot(df, aes(x = predictor1, y = 响应变量)) + geom_point(na.rm = TRUE) + # method指定用线性回归,formula里补充第二个自变量,se控制是否显示置信区间 geom_smooth(method = "lm", formula = y ~ x + predictor2, se = FALSE, color = "red", linewidth = 1)
内容的提问来源于stack exchange,提问作者user17088076
相关产品推荐
相关产品推荐

