跳转至

混合效应模型纵向数据

一句话概述:混合效应模型(Mixed-Effects Model)同时包含固定效应(所有个体共享)和随机效应(个体特异),是分析纵向(多时间点)和分层数据的标准方法,在微生物组纵向研究和临床试验中必不可少。

核心知识点速查表

概念说明
固定效应所有个体共有的效应(如治疗组的平均效果)
随机效应个体特异的偏差(如每个人的基线差异)
混合模型固定+随机效应的组合(白话:既看群体趋势,又考虑个体差异)
纵向数据同一个体多次测量(如Day0, Day7, Day30的微生物组)
嵌套结构数据有层级关系(如患者嵌套在医院中)
ICC组内相关系数,衡量组内相似度
lme4/nlmeR语言混合模型主要包

一、R语言实操

# === 线性混合效应模型 ===
library(lme4)
library(lmerTest)     # 提供p值

# 示例数据: 微生物组纵向研究
# subject: 受试者ID(多次测量)
# timepoint: 时间点(Day0, Day7, Day30)
# treatment: 治疗组/对照组
# diversity: Shannon多样性指数

# 拟合混合模型
model <- lmer(
  diversity ~ treatment * timepoint +    # 固定效应: 治疗、时间及其交互
    (1 | subject),                        # 随机效应: 每个受试者有不同截距
  data = longitudinal_data
)

summary(model)                            # 查看结果
anova(model)                               # 方差分析表

# 随机斜率模型(允许每个个体时间趋势不同)
model2 <- lmer(
  diversity ~ treatment * timepoint +
    (1 + timepoint | subject),            # 随机截距 + 随机斜率
  data = longitudinal_data
)

# 可视化
library(ggplot2)
ggplot(longitudinal_data, aes(x=timepoint, y=diversity,
                               color=treatment, group=subject)) +
  geom_line(alpha=0.3) +                  # 个体轨迹
  geom_smooth(aes(group=treatment), method="lm") +  # 组平均趋势
  theme_minimal()
# === 广义线性混合模型(非正态数据) ===
# 用于计数数据(如微生物reads数)
library(lme4)

# 负二项混合模型(微生物丰度)
library(glmmTMB)
model_nb <- glmmTMB(
  abundance ~ treatment * timepoint + (1 | subject),
  family = nbinom2,                        # 负二项分布
  data = microbiome_data
)
summary(model_nb)

二、面试高频考点

Q1: 为什么纵向数据不能用普通回归?

  • 同一个体的多次测量不独立(违反独立性假设)
  • 忽略重复测量会低估标准误,假阳性率升高
  • 混合模型通过随机效应建模个体内相关性
  • 白话:把同一个人的3次成绩当成3个人的成绩,就会高估样本量

Q2: 随机截距 vs 随机斜率?

  • 随机截距(1|subject):每个人起始值不同,变化速率相同
  • 随机斜率(1+time|subject):每个人起始值和变化速率都不同
  • 白话:随机截距=起跑线不同但速度相同;随机斜率=起跑线和速度都不同

速查表

# === 混合模型速查 ===
library(lme4); library(lmerTest)

# 线性混合模型
lmer(y ~ treatment*time + (1|subject), data=df)

# 随机斜率
lmer(y ~ treatment*time + (1+time|subject), data=df)

# 广义线性混合模型
glmer(count ~ treatment + (1|subject), family=poisson, data=df)

# 可视化
library(ggeffects)
plot(ggpredict(model, terms=c("time", "treatment")))