R(lme)与SAS(proc mixed)线性混合模型结果差异问询
R与SAS非结构化组内相关模型结果差异问题
我尝试用R语言nlme包的lme函数拟合随机系数模型,代码如下:
model_example_1 <- lme(CFB~ BASE + Dose + ADY + Dose:ADY + BASE:ADY, random = ~ ADY| SubjectID, correlation = corSymm(form = ~ 1 | SubjectID), data = example_data, method = "REML", na.action = na.exclude, control = lmeControl(msMaxIter = 2000, opt = "optim"))
这段代码用于拟合带非结构化相关的随机截距与斜率模型。同时我用SAS的proc mixed对同一数据拟合模型,代码如下:
proc mixed data example_data MAXITER= 2000; class Dose SubjectID; model CFB = Dose BASE ADY BASE *ADY Dose*ADY/SOLUTION cl DDFM= BW; random Int ADY/type=un subject=SubjectID G GCORR VCORR; run;
两者目标都是拟合带非结构化相关的随机截距斜率模型,但结果存在差异。关键发现:移除R代码中的correlation参数(即不考虑组内相关)时,结果与SAS原模型的结果完全一致:
model_example_2 <- lme(CFB~ BASE + Dose + ADY + Dose:ADY + BASE:ADY, random = ~ ADY| SubjectID, #correlation = corSymm(form = ~ 1 | SubjectID), data = example_data, method = "REML", na.action = na.exclude, control = lmeControl(msMaxIter = 2000, opt = "optim"))
编辑:2025/01/14
根据Mikko的评论,我理解到SAS的random语句中type=un是针对随机效应的协方差结构,而repeated语句中的type=un才是针对组内残差协方差。于是我保留R的model_example_1,更新SAS代码加入非结构化组内相关(添加repeated语句):
proc mixed data = example_data MAXITER= 2000; class Dose SubjectID; model CFB = Dose BASE ADY BASE*ADY Dose*ADY/SOLUTION cl DDFM= BW; random Int ADY/type=un subject=SubjectID; repeated /type=un subject=SubjectID R RCORR; run;
此时R与SAS的结果仍不一致,但当将两者的组内相关改为复合对称结构时,结果几乎完全一致。请问为什么在非结构化组内相关矩阵设定下,两者结果会存在差异?
以下是用于复现的R模拟数据代码:
set.seed(123) SubjectID <- paste0("ID_", 1:100) example_data <- data.frame(SubjectID = rep(SubjectID, each = 4), ADY_fixed = rep(c(7, 30, 60, 90), 100), ADY_error = round(runif(400, -2, 2)), BASE = rep(rnorm(100, 60, 10), each = 4), Dose = rep(c("High", "Low"), each = 200), CFB = rnorm(400, 5, 10)) example_data$ADY <- example_data$ADY_fixed + example_data$ADY_error example_data$Dose <- factor(example_data$Dose, levels = c("Low", "High"))
内容的提问来源于stack exchange,提问作者spencer886
相关产品推荐
相关产品推荐

