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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:37:03