lmer混合効果モデルのpredict()関数


27

問題:

[R]の混合効果{lme4}モデルでは利用できない他の投稿を読みました。predictlmer

おもちゃのデータセットでこのテーマを探ってみました...

バックグラウンド:

データセットはこのソースから適応され、次のように利用できます...

require(gsheet)
data <- read.csv(text = 
     gsheet2text('https://docs.google.com/spreadsheets/d/1QgtDcGJebyfW7TJsB8n6rAmsyAnlz1xkT3RuPFICTdk/edit?usp=sharing',
        format ='csv'))

これらは最初の行とヘッダーです:

> head(data)
  Subject Auditorium Education Time  Emotion Caffeine Recall
1     Jim          A        HS    0 Negative       95 125.80
2     Jim          A        HS    0  Neutral       86 123.60
3     Jim          A        HS    0 Positive      180 204.00
4     Jim          A        HS    1 Negative      200  95.72
5     Jim          A        HS    1  Neutral       40  75.80
6     Jim          A        HS    1 Positive       30  84.56

Time連続測定のいくつかの繰り返し観察()、つまりRecallいくつかの単語の割合、およびランダム効果Auditoriumテストが行​​われた場所、Subject名前)を含むいくつかの説明変数があります。そして、固定効果のような、EducationEmotion(単語の感情的な意味合いが覚えておく)、またはmgs.Caffeine試験前に摂取しました。

アイデアは、カフェイン過剰の有線被験者にとっては覚えやすいことですが、おそらく疲労のために時間の経過とともに能力は低下します。否定的な意味合いを持つ単語は覚えるのがより困難です。教育には予測可能な効果があり、講堂でさえ役割を果たします(おそらく、1つはより騒々しい、またはより快適ではなかった)。次に、いくつかの探索的なプロットを示します。


ここに画像の説明を入力してください

の関数としてのリコール率の違いEmotional ToneAuditoriumおよびEducation

ここに画像の説明を入力してください


コールのためにデータクラウド上にラインをフィッティングする場合:

fit1 <- lmer(Recall ~ (1|Subject) + Caffeine, data = data)

私はこのプロットを取得します:

次のコード(<code> predict(fit1)</ code>の呼び出しに注意してください):

library(ggplot2)
p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
  geom_point(size=3) +
  geom_line(aes(y = predict(fit1)),size=1) 
print(p)

一方、次のモデル:

fit2 <- lmer(Recall ~ (1|Subject/Time) + Caffeine, data = data)

Time並列コードを組み込むと、驚くべきプロットが得られます。

p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
  geom_point(size=3) +
  geom_line(aes(y = predict(fit2)),size=1) 
print(p)

ここに画像の説明を入力してください


質問:

predictこのlmerモデルで関数はどのように動作しますか?明らかに、Time変数を考慮しているため、より厳密にフィットTimeし、最初のプロットで描かれているこの3番目の次元を表示しようとしているジグザグになっています。

電話すると、最初のポイントに対応する最初のエントリがpredict(fit2)取得さ132.45609れます。以下は、最後の列としてのhead出力がpredict(fit2)添付されたデータセットです。

> data$predict = predict(fit2)
> head(data)
  Subject Auditorium Education Time  Emotion Caffeine Recall   predict
1     Jim          A        HS    0 Negative       95 125.80 132.45609
2     Jim          A        HS    0  Neutral       86 123.60 130.55145
3     Jim          A        HS    0 Positive      180 204.00 150.44439
4     Jim          A        HS    1 Negative      200  95.72 112.37045
5     Jim          A        HS    1  Neutral       40  75.80  78.51012
6     Jim          A        HS    1 Positive       30  84.56  76.39385

の係数は次のfit2とおりです。

$`Time:Subject`
         (Intercept)  Caffeine
0:Jason     75.03040 0.2116271
0:Jim       94.96442 0.2116271
0:Ron       58.72037 0.2116271
0:Tina      70.81225 0.2116271
0:Victor    86.31101 0.2116271
1:Jason     59.85016 0.2116271
1:Jim       52.65793 0.2116271
1:Ron       57.48987 0.2116271
1:Tina      68.43393 0.2116271
1:Victor    79.18386 0.2116271
2:Jason     43.71483 0.2116271
2:Jim       42.08250 0.2116271
2:Ron       58.44521 0.2116271
2:Tina      44.73748 0.2116271
2:Victor    36.33979 0.2116271

$Subject
       (Intercept)  Caffeine
Jason     30.40435 0.2116271
Jim       79.30537 0.2116271
Ron       13.06175 0.2116271
Tina      54.12216 0.2116271
Victor   132.69770 0.2116271

最善の策は...

> coef(fit2)[[1]][2,1]
[1] 94.96442
> coef(fit2)[[2]][2,1]
[1] 79.30537
> coef(fit2)[[1]][2,2]
[1] 0.2116271
> data$Caffeine[1]
[1] 95
> coef(fit2)[[1]][2,1] + coef(fit2)[[2]][2,1] + coef(fit2)[[1]][2,2] * data$Caffeine[1]
[1] 194.3744

代わりに取得する式は何132.45609ですか?


迅速なアクセスのためにEDIT ...受け入れ答えに応じて予測値を計算する式が(に基づくことになるranef(fit2)出力:

> ranef(fit2)
$`Time:Subject`
         (Intercept)
0:Jason    13.112130
0:Jim      33.046151
0:Ron      -3.197895
0:Tina      8.893985
0:Victor   24.392738
1:Jason    -2.068105
1:Jim      -9.260334
1:Ron      -4.428399
1:Tina      6.515667
1:Victor   17.265589
2:Jason   -18.203436
2:Jim     -19.835771
2:Ron      -3.473053
2:Tina    -17.180791
2:Victor  -25.578477

$Subject
       (Intercept)
Jason   -31.513915
Jim      17.387103
Ron     -48.856516
Tina     -7.796104
Victor   70.779432

...最初のエントリポイントの場合:

> summary(fit2)$coef[1]
[1] 61.91827             # Overall intercept for Fixed Effects 
> ranef(fit2)[[1]][2,]   
[1] 33.04615             # Time:Subject random intercept for Jim
> ranef(fit2)[[2]][2,]
[1] 17.3871              # Subject random intercept for Jim
> summary(fit2)$coef[2]
[1] 0.2116271            # Fixed effect slope
> data$Caffeine[1]
[1] 95                   # Value of caffeine

summary(fit2)$coef[1] + ranef(fit2)[[1]][2,] + ranef(fit2)[[2]][2,] + 
                    summary(fit2)$coef[2] * data$Caffeine[1]
[1] 132.4561

この投稿のコードはこちらです。


3
あったことを注意predictバージョン1.0-0以降このパッケージの機能は、2013年8月1日にリリースしました。CRANのパッケージニュースページを参照してください。なかった場合、で結果を得ることができなかったでしょうpredict。Rコマンドプロンプトでlme4 ::: predict.merModを使用してRコードを表示し、のソースパッケージに含まれるコンパイル済み関数のソースを検査できることを忘れないでくださいlme4
EdM

1
おかげで、ランダム効果を無視または含む機能があります。計算方法はどこで見つけることができますか?もし私のタイプ?predict[R]コンソール上で、私は...基本的には、{}の統計のための予測を取得
アントニParellada

@EdM ...はい、これは私にとって新しいことです...ありがとうございます。私は呼ばれていなかったpredict.merModのに、...あなたはOPで見ることができるように、私は単にpredict...
アントニParellada

1
lme4パッケージをロードし、lme4 ::: predict.merModと入力して、パッケージ固有のバージョンを確認します。からの出力lmerは、クラスのオブジェクトに保存されますmerMod
EdM

4
Rの美しさの1つは、そのような関数predictは、アクションの対象として呼び出されるオブジェクトのクラスに応じて何をすべきかを知っていることです。あなたは電話していましたpredict.merMod、あなたはそれを知りませんでした。
EdM

回答:


25

を呼び出すときに係数の表示に混乱するのは簡単ですcoef(fit2)。fit2の概要を見てください。

> summary(fit2)
Linear mixed model fit by REML ['lmerMod']
Formula: Recall ~ (1 | Subject/Time) + Caffeine
   Data: data
REML criterion at convergence: 444.5

Scaled residuals: 
 Min       1Q   Median       3Q      Max 
-1.88657 -0.46382 -0.06054  0.31430  2.16244 

Random effects:
 Groups       Name        Variance Std.Dev.
 Time:Subject (Intercept)  558.4   23.63   
 Subject      (Intercept) 2458.0   49.58   
 Residual                  675.0   25.98   
Number of obs: 45, groups:  Time:Subject, 15; Subject, 5

Fixed effects:
Estimate Std. Error t value
(Intercept) 61.91827   25.04930   2.472
Caffeine     0.21163    0.07439   2.845

Correlation of Fixed Effects:
 (Intr)
Caffeine -0.365

モデルの全体的な切片は61.92で、カフェイン係数は0.212です。したがって、カフェイン= 95の場合、平均82.06のリコールが予測されます。

を使用する代わりに、次のより高いレベルのネストで、各変量効果インターセプトと平均インターセプトの差を取得するためcoefに使用ranefします。

> ranef(fit2)
$`Time:Subject`
         (Intercept)
0:Jason    13.112130
0:Jim      33.046151
0:Ron      -3.197895
0:Tina      8.893985
0:Victor   24.392738
1:Jason    -2.068105
1:Jim      -9.260334
1:Ron      -4.428399
1:Tina      6.515667
1:Victor   17.265589
2:Jason   -18.203436
2:Jim     -19.835771
2:Ron      -3.473053
2:Tina    -17.180791
2:Victor  -25.578477
$Subject
       (Intercept)
Jason   -31.513915
Jim      17.387103
Ron     -48.856516
Tina     -7.796104
Victor   70.779432

Time = 0のJimの値は、82.06の平均値と彼Subject 彼のTime:Subject係数の合計が異なります。

82.06+17.39+33.04=132.49

132.46の丸め誤差の範囲内であると思います。

によって返されるインターセプト値は、インターセプトcoef全体SubjectまたはTime:Subject特定の違いを表すように見えるため、それらを操作するのは困難です。coef値を使用して上記の計算を行おうとすると、インターセプト全体が二重にカウントされます。


ありがとうございました!これはすごかった!私はそれが開いたままの任意の時点でこれは...ないと思う、それは、答えではないですか?
アントニ・パレラダ

ranefRコードを調べることからヒントを得ましたlme4。プレゼンテーションをいくつかの場所で明確にしました。
EdM

(+1)注:人の中に入れ子になった時間ランダム効果は、どういうわけか奇妙に見えます。
マイケルM

@MichaelM:はい、提示されたデータはネストされたデザインではなく交差(時間xサブジェクト)のように見えますが、これがOPがlme4出力の解釈方法の問題を提起した方法です。また、提示されたデータは、分析対象の実際の研究であるというよりも、例示のためであるように思われました。
EdM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.