如何在RStudio中为Spaghetti图拟合多项式回归曲线?
在Spaghetti图上添加拟合回归曲线的解决方案
我来帮你搞定在lattice绘制的Spaghetti图上添加拟合曲线的问题~首先得说,你之前尝试用base绘图的plot和lines是行不通的,因为lattice属于网格图形系统,和base绘图系统是完全独立的,没法直接混用。下面给你两种靠谱的实现方式:
方法一:在lattice中直接添加拟合线
1. 添加整体数据的Lowess平滑曲线
直接在xyplot的panel参数里自定义绘图逻辑,先画原始的Spaghetti线,再叠加lowess拟合线:
library(lattice) xyplot(GCIP ~ time_since_on, groups = Patient, type = 'b', data = data_head, panel = function(x, y, ...) { # 先绘制每个患者的点和线 panel.xyplot(x, y, ...) # 计算并添加整体的lowess平滑线 smooth_line <- lowess(x, y) panel.lines(smooth_line$x, smooth_line$y, col = "red", lwd = 2) })
2. 添加多项式回归拟合线(比如二次多项式)
先拟合回归模型,生成预测值,再把拟合线加到图里:
# 第一步:拟合二次多项式模型 poly_model <- lm(GCIP ~ poly(time_since_on, 2), data = data_head) # 第二步:生成用于预测的x序列(让拟合线更平滑) x_pred <- seq(min(data_head$time_since_on), max(data_head$time_since_on), length.out = 100) y_pred <- predict(poly_model, newdata = data.frame(time_since_on = x_pred)) # 第三步:绘制图形并叠加拟合线 xyplot(GCIP ~ time_since_on, groups = Patient, type = 'b', data = data_head, panel = function(x, y, ...) { panel.xyplot(x, y, ...) panel.lines(x_pred, y_pred, col = "blue", lwd = 2, lty = 2) # 虚线区分 })
3. 给每个患者单独添加拟合线
如果需要给每个分组(Patient)都加一条自己的拟合线,可以用panel.superpose来处理分组:
xyplot(GCIP ~ time_since_on, groups = Patient, type = 'b', data = data_head, panel = function(x, y, groups, ...) { panel.superpose(x, y, groups = groups, panel.groups = function(x, y, ...) { # 绘制当前组的点和线 panel.xyplot(x, y, type = 'b', ...) # 添加当前组的lowess拟合线 group_smooth <- lowess(x, y) panel.lines(group_smooth$x, group_smooth$y, col = current.panel.colors()$col, lwd = 1.5) }) # 可选:添加一条整体的拟合线作为参考 overall_smooth <- lowess(x, y) panel.lines(overall_smooth$x, overall_smooth$y, col = "black", lwd = 2, lty = 3) })
方法二:用ggplot2实现(更直观易读)
如果你愿意换用ggplot2,代码结构会更清晰,添加拟合线也更简单:
library(ggplot2) # 1. Spaghetti图 + 整体lowess平滑线 ggplot(data_head, aes(x = time_since_on, y = GCIP, group = Patient, color = Patient)) + geom_point() + geom_line() + geom_smooth(method = "loess", se = FALSE, color = "red", lwd = 1.5) + # 关闭置信区间 theme_bw() # 2. Spaghetti图 + 二次多项式拟合线 ggplot(data_head, aes(x = time_since_on, y = GCIP, group = Patient, color = Patient)) + geom_point() + geom_line() + geom_smooth(method = "lm", formula = y ~ poly(x, 2), se = FALSE, color = "blue", lwd = 1.5) + theme_bw() # 3. 给每个患者单独添加拟合线 ggplot(data_head, aes(x = time_since_on, y = GCIP, group = Patient, color = Patient)) + geom_point() + geom_line() + geom_smooth(method = "loess", se = FALSE, lwd = 1) + # 每个组自己的拟合线 theme_bw()
内容的提问来源于stack exchange,提问作者Lili
相关产品推荐
相关产品推荐

