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

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就实现了和SAS TYPE=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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:33:34