PROC Mixed 和 lme / lmer 在 R - 自由度上的区别

机器算法验证 r 混合模式 sas 自由程度
2022-03-24 08:04:42

注意:这个问题是一个转贴,因为我之前的问题出于法律原因必须被删除。


在将 SAS 中的 PROC MIXED 与Rlme中的nlme包中的函数进行比较时,我偶然发现了一些相当令人困惑的差异。更具体地说,不同测试中的自由度在 和 之间有所不同PROC MIXEDlme我想知道为什么。

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

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

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

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

请注意,最后一个模型应该会导致奇点,因为和y的每个组合只有 1 个值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 检验时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
1个回答

对于第一个问题,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 代码不太匹配;它只有一个 术语,而 R 代码对fac*ind都有一个术语(请参阅方差分量输出以查看此内容。)添加此内容可为Q1 和 Q2 中的所有模型提供相同的 SE (0.1892)。indfac*indtrt

正如您所注意到的,这是一个奇怪的模型,因为该fac*ind术语对每个级别都有一个观察值,因此等效于误差项。这反映在 SAS 输出中,其中fac*ind项的方差为零。这也是 lme4 的错误信息告诉你的;错误的原因是您很可能错误地指定了某些内容,因为您以两种不同的方式在模型中包含了错误项。有趣的是,nlme 模型有一点不同。除了误差项之外,它以某种方式为该项找到了一个方差项fac*ind,但是您会注意到这两个方差的总和等于 SAS 和 nlme 没有该项的误差fac*ind项。但是,SEtrttrt嵌套在ind,所以这些较低的方差项不会影响它。

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

此外,使用具有给定数量自由度的 t 和 F 近似值是相当有争议的。不仅有几种近似 df 的方法,有些人认为这样做的做法无论如何都不是一个好主意。几句忠告:

  1. 如果一切都是平衡的,请将结果与传统的最小二乘法进行比较,因为它们应该是一致的。如果它接近平衡,请自己计算(假设平衡),以便确保您使用的那些在正确的范围内。

  2. 如果您的样本量很大,则自由度并不重要,因为分布接近正态和卡方。

  3. 查看 Doug Bates 的推理方法。他的旧方法是基于 MCMC 模拟。他的新方法是基于分析可能性。