You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:24:17