注:法的な理由で以前の質問を削除する必要があったため、この質問は再投稿です。
SASのPROC MIXED をR lme
の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に対して同じ推定値を与えますがtrt
、の効果に対してF検定を実行する場合、異なる自由度を使用します。
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 =オプションに異なる値を試しました(理論的にはlmeと同じ結果になるはずのBETWITHINを含む)
セカンドモデル
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