我一直在尝试将重复测量模型从SAS转换为R,因为合作者将进行分析,但没有SAS。我们正在处理4组,每组8到10只动物,然后每只动物5个时间点。模拟数据文件在此处https://drive.google.com/file/d/0B-WfycVUQyhaVGU2MUpuQkg4Mk0/edit?usp=sharing可用作Rdata文件,此处https://drive.google.com/file/d/0B-WfycVUQyhaR0JtZ0V4VjRkTk0/edit?usp=sharing可用作excel文件:
原始SAS代码(1)是:
proc mixed data=essai.data_test method=reml;
class group time mice;
model param = group time group*time / ddfm=kr;
repeated time / type=un subject=mice group=group;
run;
给出了:
Type 3 Tests des effets fixes
DDL DDL Valeur
Effet Num. Res. F Pr > F
group 3 15.8 1.58 0.2344
time 4 25.2 10.11 <.0001
group*time 12 13.6 1.66 0.1852
我知道R不像SAS那样处理自由度,所以我首先尝试获得类似于(2)的结果:
proc mixed data=essai.data_test method=reml;
class group time mice;
model param = group time group*time;
repeated time / type=un subject=mice group=group;
run;
我在这里找到了一些提示Converting Repeated Measures mixed model formula from SAS to R,并且在指定复合对称相关矩阵时,这非常有效。但是,我无法为一般相关矩阵获得相同的东西。
使用SAS中的(2),我得到以下结果:
Type 3 Tests des effets fixes
DDL DDL Valeur
Effet Num. Res. F Pr > F
group 3 32 1.71 0.1852
time 4 128 11.21 <.0001
group*time 12 128 2.73 0.0026
使用以下R代码:
options(contrasts=c('contr.sum','contr.poly'))
mod <- lme(param~group*time, random=list(mice=pdDiag(form=~group-1)),
correlation = corSymm(form=~1|mice),
weights = varIdent(form=~1|group),
na.action = na.exclude, data = data, method = "REML")
anova(mod,type="marginal")
我获得:
numDF denDF F-value p-value
(Intercept) 1 128 1373.8471 <.0001
group 3 32 1.5571 0.2189
time 4 128 10.0628 <.0001
group:time 12 128 1.6416 0.0880
自由度是相似的,但不是对固定效果的测试,我不知道它来自何处。谁能知道我在这里做错了什么?
答案 0 :(得分:1)
您的R代码在多种方面与SAS代码不同。其中一些是可修复的,但我无法修复所有方面来重现SAS分析。
R代码适合具有随机mice
效果的混合效应模型,而SAS代码适合允许残差之间相关性的广义线性模型,但没有随机效应(因为有没有RANDOM
声明)。在R中,您必须使用同一gls
包中的nlme
函数。
在R代码中,同一组内的所有观察结果具有相同的方差,而在SAS代码中,您具有非结构化协方差矩阵,即每个组中的每个时间点都有自己的方差。使用weights=varIdent(form=~1|group*time)
。
在R代码中,无论组如何,每个鼠标的相关矩阵都是相同的。在SAS代码中,每个组都有自己的相关矩阵。这是我不知道如何在R中重现的部分。
我必须注意到R模型似乎更有意义 - SAS估计的方差和相关性太多(顺便说一下,你可以看到使用R
和RCORR
进行有意义的排列repeated
语句的选项。
答案 1 :(得分:0)
“在R代码中,每组鼠标的相关矩阵都是相同的,而与组无关。在SAS代码中,每组都有自己的相关矩阵。这是我不知道如何在R中再现的部分。” -尝试:correlation = corSymm(〜1 | group * time)