在R中为含分箱变量的散点图添加回归拟合线(多数据集)
实现分箱散点+跨数据集三阶拟合线的方案
关键修正:回归模型的正确写法
原代码里的log_rank_ratio^2在lm()中会被解析为交互项,而非数学意义上的平方,必须用I()包裹才能正确表示多项式项:
fit1 <- lm(quit ~ favorite + log_rank_ratio + I(log_rank_ratio^2) + I(log_rank_ratio^3), data = data_1)
方法一:直接用geom_smooth快速添加拟合线
在现有散点图代码中加入geom_smooth,指定基于data_1的三阶模型,同时限定x轴范围:
lost <- ggplot(data = data_2, aes(x = log_rank_ratio, y = quit, color = as.factor(favorite))) + geom_point(size = 2) + # 基于data_1的三阶拟合线,如需置信区间可将se设为TRUE geom_smooth(data = data_1, method = "lm", formula = y ~ favorite + x + I(x^2) + I(x^3), se = FALSE, linewidth = 1) + theme_bw() + xlab("Log Rank Ratio") + ylab("Observed Likelihood of Quitting Mid-Match") + geom_vline(xintercept = 0, linetype = "dashed", alpha = .7) + xlim(-1, 1) # 限定x轴范围为-1到1
方法二:生成预测数据绘制拟合线(更灵活)
先基于data_1的模型生成预测序列,再用geom_line绘制,适合需要自定义拟合线细节的场景:
# 生成x范围-1到1的预测数据集,按favorite分组 new_data <- expand.grid( log_rank_ratio = seq(-1, 1, length.out = 100), favorite = unique(data_1$favorite) ) # 用模型预测y值 new_data$pred_quit <- predict(fit1, newdata = new_data) # 绘制图形 lost <- ggplot() + # 分箱数据集的散点 geom_point(data = data_2, aes(x = log_rank_ratio, y = quit, color = as.factor(favorite)), size = 2) + # 基于预测数据的拟合线 geom_line(data = new_data, aes(x = log_rank_ratio, y = pred_quit, color = as.factor(favorite)), linewidth = 1) + theme_bw() + xlab("Log Rank Ratio") + ylab("Observed Likelihood of Quitting Mid-Match") + geom_vline(xintercept = 0, linetype = "dashed", alpha = .7) + xlim(-1, 1)
注意事项
- 必须用
I()包裹多项式项,否则lm()会错误解析为交互项,导致模型偏差。 - 两种方法都能实现需求,方法二更适合调整拟合线的点数、样式,方法一更简洁高效。
xlim(-1,1)确保图形严格限定在需求的x范围之内。
内容的提问来源于stack exchange,提问作者Aleya
相关产品推荐
相关产品推荐

