注意:这个问题是一个转贴,因为我之前的问题出于法律原因必须被删除。
在将 SAS 中的 PROC MIXED 与Rlme
中的nlme
包中的函数进行比较时,我偶然发现了一些相当令人困惑的差异。更具体地说,不同测试中的自由度在 和 之间有所不同PROC MIXED
,lme
我想知道为什么。
从以下数据集开始(下面给出的 R 代码):
- ind :表示进行测量的个人的因素
- fac : 进行测量的器官
- trt : 表示治疗的因素
- y : 一些连续响应变量
这个想法是建立以下简单的模型:
y ~ trt + (ind)
:ind
作为随机因子
y ~ trt + (fac(ind))
:作为随机因子fac
嵌套ind
请注意,最后一个模型应该会导致奇点,因为和y
的每个组合只有 1 个值。ind
fac
第一个模型
在 SAS 中,我构建了以下模型:
PROC MIXED data=Data;
CLASS ind fac trt;
MODEL y = trt /s;
RANDOM ind /s;
run;
根据教程,R中使用的相同模型nlme
应该是:
> require(nlme)
> options(contrasts=c(factor="contr.SAS",ordered="contr.poly"))
> m2<-lme(y~trt,random=~1|ind,data=Data)
两个模型对系数及其 SE 给出了相同的估计,但是在对 的影响进行 F 检验时trt
,它们使用不同的自由度:
SAS :
Type 3 Tests of Fixed Effects
Effect Num DF Den DF F Value Pr > F
trt 1 8 0.89 0.3724
R :
> anova(m2)
numDF denDF F-value p-value
(Intercept) 1 8 70.96836 <.0001
trt 1 6 0.89272 0.3812
问题1:这两种测试有什么区别?两者都使用 REML 进行拟合,并使用相同的对比。
注意:我为 DDFM= 选项尝试了不同的值(包括 BETWITHIN,理论上应该给出与 lme 相同的结果)
第二个模型
在 SAS 中:
PROC MIXED data=Data;
CLASS ind fac trt;
MODEL y = trt /s;
RANDOM fac(ind) /s;
run;
R中的等效模型应该是:
> m4<-lme(y~trt,random=~1|ind/fac,data=Data)
在这种情况下,有一些非常奇怪的区别:
- R 没有抱怨就适合,而 SAS 指出最终的粗麻布不是正定的(这并不让我感到惊讶,见上文)
- 系数上的 SE 不同(在 SAS 中较小)
- 同样,F 检验使用了不同数量的 DF(事实上,在 SAS 中该数量 = 0)
SAS 输出:
Effect trt Estimate Std Error DF t Value Pr > |t|
Intercept 0.8863 0.1192 14 7.43 <.0001
trt Cont -0.1788 0.1686 0 -1.06 .
输出:
> summary(m4)
...
Fixed effects: y ~ trt
Value Std.Error DF t-value p-value
(Intercept) 0.88625 0.1337743 8 6.624963 0.0002
trtCont -0.17875 0.1891855 6 -0.944840 0.3812
...
(请注意,在这种情况下,F 和 T 检验是等效的,并且使用相同的 DF。)
有趣的是,lme4
在 R 中使用时,模型甚至不适合:
> require(lme4)
> m4r <- lmer(y~trt+(1|ind/fac),data=Data)
Error in function (fr, FL, start, REML, verbose) :
Number of levels of a grouping factor for the random effects
must be less than the number of observations
问题2:这些具有嵌套因子的模型有什么区别?它们是否正确指定,如果正确,结果为何如此不同?
R 中的模拟数据:
Data <- structure(list(y = c(1.05, 0.86, 1.02, 1.14, 0.68, 1.05, 0.22,
1.07, 0.46, 0.65, 0.41, 0.82, 0.6, 0.49, 0.68, 1.55), ind = structure(c(1L,
2L, 3L, 1L, 3L, 4L, 4L, 2L, 5L, 6L, 7L, 8L, 6L, 5L, 7L, 8L), .Label = c("1",
"2", "3", "4", "5", "6", "7", "8"), class = "factor"), fac = structure(c(1L,
1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L), .Label = c("l",
"r"), class = "factor"), trt = structure(c(2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Cont",
"Treat"), class = "factor")), .Names = c("y", "ind", "fac", "trt"
), row.names = c(NA, -16L), class = "data.frame")
模拟数据:
y ind fac trt
1.05 1 l Treat
0.86 2 l Treat
1.02 3 l Treat
1.14 1 r Treat
0.68 3 r Treat
1.05 4 l Treat
0.22 4 r Treat
1.07 2 r Treat
0.46 5 r Cont
0.65 6 l Cont
0.41 7 l Cont
0.82 8 l Cont
0.60 6 r Cont
0.49 5 l Cont
0.68 7 r Cont
1.55 8 r Cont