SAS混合效应模型(TYPE=UN)转R实现:结果不匹配求解
问题根源
你用R的lmer拟合的模型和SAS的PROC MIXED完全不是一回事:
- SAS代码里的
REPEATED time / SUBJECT = patient_id TYPE = UN,是给每个患者的重复观测(按time分组)指定无结构(UN)的残差协方差矩阵——简单说就是允许不同时间点的残差之间的协方差自由估计,没有任何约束。 - 而你写的
lmer(y ~ trt + time + (1 | patient_id))只是个随机截距模型,它假设不同时间点的残差是独立且方差相同的,这种结构差异直接导致了结果不匹配。
解决方案:用其他R包实现SAS的无结构协方差模型
lme4确实不支持指定无结构的残差协方差,你可以用以下两种方法在R中拟合和SAS一致的模型:
方法1:用nlme包的lme函数
nlme包支持多种残差协方差结构,包括无结构,代码如下:
library(nlme) # 先把time转成因子(对应SAS的CLASS time) mydata$time <- factor(mydata$time) # 拟合与SAS匹配的模型 model <- lme(y ~ trt + time, data = mydata, random = ~1 | patient_id, # 对应SAS默认的随机截距 correlation = corSymm(form = ~1 | patient_id), # 指定无结构相关矩阵 weights = varIdent(form = ~1 | time)) # 允许不同时间点残差方差不同,对应TYPE=UN的方差部分 # 查看结果 summary(model)
说明:
corSymm对应无结构相关矩阵,加上varIdent就实现了和SASTYPE=UN完全一致的协方差结构(UN允许每个时间点有不同方差,且任意两个时间点的协方差自由估计)。如果你的SAS模型没加额外的RANDOM语句,上面的random = ~1 | patient_id和SAS的默认设置对齐。
方法2:用geepack包拟合边际模型
SAS的这个模型本质是边际模型(群体平均效应),用GEE拟合也能得到一致结果,geepack的geeglm支持无结构工作相关矩阵:
library(geepack) mydata$time <- factor(mydata$time) model <- geeglm(y ~ trt + time, data = mydata, id = patient_id, corstr = "unstructured") summary(model)
说明:GEE得到的边际效应和SAS
PROC MIXED仅用REPEATED语句输出的结果完全一致。
结果匹配检查
如果拟合后结果还是和SAS有差异,排查这几点:
- 确认
time在R中是因子型(SAS里用了CLASS time,如果R中是连续型,模型解释完全不同)。 - 把数据按
patient_id和time排序,和SAS的默认排序一致,避免协方差矩阵对应错误。 - 检查SAS的
METHOD设置:SAS默认用REML,lme也默认REML;如果SAS用了ML,在lme里加method="ML"即可。
内容的提问来源于stack exchange,提问作者camhsdoc
相关产品推荐
相关产品推荐

