Spaghetti图中二次拟合曲线构建:能否采用LME模型实现?
用LME模型拟合Spaghetti图的二次曲线
当然可以用LME(线性混合效应模型)来完成这件事!相比单纯靠ggplot绘制曲线,LME能更好地捕捉Patient.ID这类分组变量的随机效应——毕竟你的Spaghetti图就是要展示每个患者的个性化趋势嘛。下面一步步来实现:
1. 准备二次项变量
首先要为时间变量创建平方项,这是拟合二次曲线的必要前提:
data_head$time_sq <- data_head$time_since_on^2
2. 拟合LME模型
这里提供两种常用的实现方式,你可以根据自己的习惯选择:
方式一:用nlme::lme(传统LME工具)
先加载包,然后构建模型。我们先从简单的随机截距模型开始(每个患者有独立的基线水平),如果需要更灵活的个体趋势,再扩展为随机斜率模型:
library(nlme) # 随机截距模型:每个患者有独立截距,共享固定的一次项/二次项系数 lme_model <- lme( GCIP ~ time_since_on + time_sq, random = ~1 | Patient.ID, data = data_head ) # (可选)随机斜率模型:每个患者有独立的截距、一次项和二次项系数 lme_model <- lme( GCIP ~ time_since_on + time_sq, random = ~time_since_on + time_sq | Patient.ID, data = data_head )
方式二:用lme4::lmer(现代语法风格)
如果你更习惯lme4的简洁语法,代码逻辑是一致的:
library(lme4) # 随机截距模型 lmer_model <- lmer( GCIP ~ time_since_on + time_sq + (1 | Patient.ID), data = data_head ) # (可选)随机斜率模型 lmer_model <- lmer( GCIP ~ time_since_on + time_sq + (time_since_on + time_sq | Patient.ID), data = data_head )
拟合完成后,可以用summary(lme_model)或summary(lmer_model)查看固定效应、随机效应的详细结果,评估模型拟合质量。
3. 生成拟合预测值
为了在Spaghetti图上画出每个患者的拟合曲线,我们需要用模型生成对应预测值:
# 针对nlme模型 data_head$pred_gcip <- predict(lme_model, data = data_head) # 针对lme4模型 data_head$pred_gcip <- predict(lmer_model, data = data_head)
4. 用ggplot绘制带拟合曲线的Spaghetti图
现在把原始数据点和LME拟合的二次曲线结合起来,替换你原来未完成的绘图代码:
library(ggplot2) ggplot(data = data_head, aes(x = time_since_on, y = GCIP, colour = Patient.ID)) + geom_point(alpha = 1, size = 2) + # 原始观测点 geom_line(aes(y = pred_gcip), linetype = "solid") + # LME拟合的二次曲线 labs(x = "Time Since Onset", y = "GCIP", colour = "Patient ID") + theme_minimal()
这样你就能得到每个患者的原始数据点,以及贴合个体差异的二次拟合曲线啦!
内容的提问来源于stack exchange,提问作者Lili
相关产品推荐
相关产品推荐

