如何用R的lme包实现有序逻辑回归?含联合模型相关疑问
带有序纵向数据的联合模型实现方案(基于JM包与lme)
1. 核心可行性结论
完全可以在lme框架(结合JM包)实现你的需求。nlme包的lme()函数支持广义线性混合模型(GLMM),有序逻辑回归作为GLMM的子类,可通过指定对应分布族和链接函数实现;JM包能将这类有序纵向模型与生存模型进行联合建模。
2. 模拟数据+实操步骤
步骤1:加载依赖包
library(nlme) library(JM) library(MASS)
步骤2:模拟符合要求的数据集
先生成个体随机效应,再构建有序纵向结局,最后生成和纵向过程关联的生存数据:
set.seed(123) n <- 200 # 个体数量 times <- seq(0, 5, by = 1) # 纵向观测时间点 n_times <- length(times) # 模拟个体水平随机效应(截距+斜率) id <- rep(1:n, each = n_times) b0 <- rnorm(n, 0, 0.5) b1 <- rnorm(n, 0, 0.3) # 生成纵向结局的线性预测器 X <- model.matrix(~ times, data = data.frame(times = rep(times, n))) eta <- X %*% c(0.2, 0.5) + b0[id] + b1[id] * rep(times, n) # 生成3等级有序响应 cutpoints <- c(-1, 1) y <- cut(eta, breaks = c(-Inf, cutpoints, Inf), labels = c("Low", "Medium", "High")) y <- as.ordered(y) # 纵向数据集 long_data <- data.frame(id = id, time = rep(times, n), y = y) # 模拟生存数据(关联纵向随机效应) surv_eta <- 0.3*b0 + 0.4*b1 surv_time <- rexp(n, rate = exp(surv_eta)) event <- rep(1, n) # 假设全部发生事件 surv_data <- data.frame(id = 1:n, time = surv_time, event = event)
步骤3:拟合有序纵向混合模型
如果lme直接支持ordinal族,可用以下代码:
long_model <- lme(y ~ time, random = ~ time | id, data = long_data, family = ordinal("logit"))
若版本兼容问题,改用MASS包的glmmPQL(基于lme框架):
long_model <- glmmPQL(y ~ time, random = ~ time | id, data = long_data, family = polr("logit"))
步骤4:构建联合模型
用JM包将纵向模型与生存模型关联,示例采用当前值关联(生存风险与纵向结局的当前水平挂钩):
# 先拟合单独的Cox模型 surv_model <- coxph(Surv(time, event) ~ 1, data = surv_data, x = TRUE) # 构建联合模型 joint_model <- jointModel(long_model, surv_model, timeVar = "time", method = "spline", association = list("currentValue" = TRUE)) # 查看结果 summary(joint_model)
3. 关键细节提示
- 有序纵向模型的lme逻辑:本质是把有序响应转换成累积logit模型,通过随机效应引入个体异质性,核心是指定合适的有序分布族。
- 联合模型关联方式:JM包支持当前值、斜率、积分值等多种关联结构,可根据研究假设调整
association参数。 - 模拟数据核心:确保有序纵向结局通过阈值划分生成,同时让生存时间与纵向随机效应绑定,还原联合模型需要的依赖关系。
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

