使用随机截距模型拟合值绘图为何斜率不同?如何修正?
问题解决:让随机截距模型的Spaghetti Plot斜率一致
问题原因
你用geom_smooth(method = lm)对每个id的拟合值重新做线性回归,这和原模型的固定斜率无关——拟合值包含了Time变量的影响,每个id内Stress_RQ1和Time可能存在关联,导致拟合出的斜率偏离模型的固定系数。
修正方案:基于模型参数生成预测线
直接用随机截距模型的固定斜率和每个id的随机截距,生成控制Time后的预测值,再绘制线条,确保所有id的回归线斜率一致。
步骤1:提取模型参数
# 提取固定效应系数 fixed_coef <- fixef(model1a) stress_fixed_slope <- fixed_coef["Stress_RQ1"] fixed_intercept <- fixed_coef["(Intercept)"] time_fixed_slope <- fixed_coef["Time"] # 提取每个id的随机截距,并计算总截距(固定截距+随机截距) id_random_intercepts <- ranef(model1a)$id[, "(Intercept)"] id_total_intercepts <- fixed_intercept + id_random_intercepts
步骤2:生成控制Time的预测数据
选择Time的均值(或你需要的固定值),生成每个id在Stress_RQ1全范围内的预测值:
# 创建预测网格:覆盖Stress_RQ1的全部范围,包含所有id,固定Time为均值 pred_data <- expand.grid( Stress_RQ1 = seq(min(data_mini_clean$Stress_RQ1), max(data_mini_clean$Stress_RQ1), length.out = 100), id = unique(data_mini_clean$id), Time = mean(data_mini_clean$Time) ) # 计算每个id的预测值 pred_data$MET_pred <- id_total_intercepts[as.character(pred_data$id)] + stress_fixed_slope * pred_data$Stress_RQ1 + time_fixed_slope * pred_data$Time
步骤3:绘制Spaghetti Plot
用geom_line绘制每个id的回归线,用geom_abline绘制总体回归线:
ggplot() + # 绘制每个id的回归线(斜率统一为模型固定斜率) geom_line(data = pred_data, aes(x = Stress_RQ1, y = MET_pred, group = factor(id), color = factor(id)), alpha = 0.3) + # 绘制总体固定效应回归线 geom_abline( intercept = fixed_intercept + time_fixed_slope * mean(data_mini_clean$Time), slope = stress_fixed_slope, color = "blue", linewidth = 1 ) + scale_color_viridis_d(option = "F", begin = 0, end = 1) + labs(x = "Stress_RQ1", y = "MET_mean (log, predicted at mean Time)") + theme_minimal()
补充说明
如果一定要基于原始拟合值绘图,你需要排除Time的干扰,但这种方法不如直接用模型参数可靠。更简单的方式是,每个id的回归线应该是模型固定斜率加上该id的拟合截距(当Stress_RQ1取特定值时的拟合值),但这需要确保Time在每个id内是固定的,否则仍会有偏差。
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

