PROC Mixed和LME / LMER在R自由度上的区别


12

注意:这个问题是一个转贴,因为我的上一个问题出于法律原因不得不删除。


在比较SAS的PROC MIXED与R中lmenlme软件包的功能时,我偶然发现了一些相当混乱的差异。更具体地说,不同测试的自由度在PROC MIXED和之间有所不同lme,我想知道为什么。

从以下数据集(以下给出的R代码)开始:

  • ind:指示进行测量的个人的因子
  • fac:进行测量的器官
  • trt:表示治疗的因素
  • y:一些连续响应变量

这个想法是建立以下简单模型:

y ~ trt + (ind)ind作为随机因子 y ~ trt + (fac(ind))fac嵌套在ind作为随机因子

需要注意的是最后一个模型应引起奇异性,因为只有1的值y对每一个组合indfac

第一模型

在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的影响进行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 . 

R输出

> 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

@Aaron:请在这篇文章中找到答案。如果您可以复制并粘贴它作为答案,我将为您提供代表。它非常有帮助,因此我真的想将其保留在此处进行交叉验证。完成此操作后,我将从问题中删除您的答案。
Joris Meys 2012年

我正在努力使团队彻底消除这个不幸的修订,从而使您的原始Q复活-因此,有很大的机会恢复原始答案并将其合并到此处。

@mbq:很好,尽管我模拟了一些数据(在这里使用)并相应地编辑了Aaron的答案。对于其他答案,这将有些复杂,但我也可以尝试。
Joris Meys 2012年

亚伦的答案是一个非常好的答案。我希望他们能看到。不幸的是,除非他参与了此线程,否则您的@Aaron不会与他联系。
韦恩(Wayne)2012年

1
是的,这是一个不错的答案。在这里,我提供了指向已删除帖子的链接:stats.stackexchange.com/questions/26556 / ...我将向该帖子添加链接。
斯特凡劳伦

Answers:


11

对于第一个问题,SAS中查找df的默认方法不是很聪明。它在语法上包含固定效应的随机效应中寻找术语,并使用该术语。在这种情况下,由于trt在中找不到ind,所以它做的不正确。我从未尝试过BETWITHIN,也不知道详细信息,但是Satterthwaite选项(satterth)或ind*trt用作随机效果都能提供正确的结果。

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s ddfm=satterth;
    RANDOM ind /s;
run;

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s;
    RANDOM ind*trt /s;
run;

至于第二个问题,您的SAS代码与您的R代码不太匹配;它仅具有对术语fac*ind,而将R代码有两个术语indfac*ind。(请参阅方差组件输出以查看此内容。)添加此值将为trtQ1和Q2(0.1892)中的所有模型提供相同的SE 。

如您所述,这是一个奇数模型,因为该fac*ind术语在每个级别上都有一个观察值,因此等效于误差术语。这反映在SAS输出中,该fac*ind术语的方差为零。这也是来自lme4的错误消息告诉您的内容。错误的原因是,您很可能错误指定了某些内容,因为您以两种不同的方式将错误项包含在模型中。有趣的是,nlme模型略有不同。它以某种方式找到了误差项fac*ind之外的误差项,但是您会注意到,这两个方差之和等于SAS和nlme中没有误差项的误差fac*ind项。但是,SE的SE trttrt嵌套在SE中的SE 相同(0.1892)ind,因此这些较低的方差项不会对其产生影响。

最后,关于这些模型中的自由度的一般说明:它们是在模型拟合后计算的,因此不同程序或程序选项之间的自由度差异不一定意味着模型的拟合度不同。为此,必须注意参数的估计,包括固定效果参数和协方差参数。

同样,在给定的自由度下使用t和F近似值也引起很大争议。不仅有几种近似df的方法,而且有些人认为这样做并不是一个好主意。几个建议:

  1. 如果一切都平衡,则应将结果与传统的最小二乘法比较,因为他们应该同意。如果接近平衡,请自行计算(假设平衡),以确保所使用的平衡点在正确的范围内。

  2. 如果样本量较大,则自由度无关紧要,因为分布接近于正态分布和卡方。

  3. 查看Doug Bates的推理方法。他的较旧方法基于MCMC仿真。他的新方法基于对可能性的分析。


确实,这是一个很好的答案,尽管我认为与通过MCMC模拟(处理有限大小的校正和非二次性)进行可能性分析相比,可以解决不同的问题(方差参数为非二次方的方差参数的适当CI)。我认为bootMer(参数引导程序)比confint(profile(...))更接近mcmcsamp的等效项...
Ben Bolker 2012年

@BenBolker:当然可以。道格·贝茨(Doug Bates)上个月在这里进行了演讲,他谈到了他对可能性进行概要分析的想法。到目前为止,这就是我所知道的全部信息。
亚伦(Aaron)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.