भविष्यवाणी () lmer मिश्रित प्रभाव मॉडल के लिए फ़ंक्शन


27

समस्या:

मैंने अन्य पोस्टों में पढ़ा है जो predictमिश्रित प्रभावों के लिए उपलब्ध नहीं है lmer{lme4} मॉडल [R] में।

मैंने एक खिलौना डाटासेट के साथ इस विषय की खोज करने की कोशिश की ...

पृष्ठभूमि:

डेटासेट को इस स्रोत के रूप में अनुकूलित किया गया है , और इसके रूप में उपलब्ध ...

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नाम); और निश्चित प्रभाव , जैसे Education, Emotion(याद करने के लिए शब्द का भावनात्मक अर्थ), या MGS।का Caffeineपरीक्षण करने से पहले किया जाता।

यह विचार है कि हाइपर-कैफीनयुक्त वायर्ड विषयों के लिए याद रखना आसान है, लेकिन समय के साथ क्षमता कम हो जाती है, शायद थकान के कारण। नकारात्मक अर्थ के साथ शब्दों को याद रखना अधिक कठिन है। शिक्षा का एक पूर्वानुमानित प्रभाव होता है, और यहां तक ​​कि सभागार भी एक भूमिका निभाता है (शायद एक अधिक शोर, या कम आरामदायक था)। यहाँ खोजपूर्ण भूखंडों के एक जोड़े हैं:


यहाँ छवि विवरण दर्ज करें

के एक समारोह के रूप में याद करते हैं दर में अंतर Emotional Tone, Auditoriumऔर Education:

यहाँ छवि विवरण दर्ज करें


जब कॉल के लिए डेटा क्लाउड पर फिटिंग लाइन:

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

मुझे यह प्लॉट मिलता है:

निम्नलिखित कोड के साथ (नोटिस कोड के लिए कॉल करें> भविष्यवाणी (फिट 1) </ कोड> इसमें):

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पहले भूखंड में चित्रित के इस तीसरे आयाम को प्रदर्शित करने की कोशिश कर रहा है ।

यदि मैं फोन करता 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
ध्यान दें कि predict2013-08-01 के संस्करण 1.0-0 के बाद से इस पैकेज में एक समारोह हुआ है। CRAN में पैकेज समाचार पृष्ठ देखें । अगर वहाँ नहीं था, आप के साथ किसी भी परिणाम प्राप्त करने में सक्षम नहीं होगा predict। यह न भूलें कि आप R कोड को lme4 के साथ देख सकते हैं ::: predict.merMod पर R कमांड प्रॉम्प्ट, और स्रोत पैकेज में किसी भी अंतर्निहित संकलित फ़ंक्शन के लिए स्रोत का निरीक्षण करें lme4
एड्म

1
धन्यवाद, मैं देख रहा हूँ कि या तो अनियमित प्रभावों के साथ कार्यक्षमता है या शामिल है। क्या आप जानते हैं कि मैं कहां मिल सकता हूं कि इसकी गणना कैसे की जाती है? यदि मैं ?predict[r] कंसोल पर टाइप करता हूं, तो मुझे {आंकड़े} के लिए मूल भविष्यवाणी मिलती है ...
एंटोनी परेलाडा

@ ईडीएम ... हां, यह मेरे लिए नया है ... धन्यवाद। मैंने फोन नहीं किया था predict.merMod, हालांकि ... जैसा कि आप ओपी पर देख सकते हैं, मैंने बस फोन किया predict...
एंटोनी परेलाडा

1
lme4पैकेज लोड करें , फिर टाइप करें lme4 ::: predict.merMod पैकेज-विशिष्ट संस्करण देखने के लिए। से आउटपुट lmerको क्लास के ऑब्जेक्ट में स्टोर किया जाता है merMod
ईडीएम

4
आर की सुंदरियों में से एक यह है कि एक फ़ंक्शन जैसा predictजानता है कि उस वस्तु के वर्ग के आधार पर क्या करना है जिसे इसे कार्य करने के लिए कहा जाता है। आप फोन predict.merModकर रहे थे , आप इसे नहीं जानते थे।
ईडीएम

जवाबों:


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

जिम में समय = 0 का मान उसके Subject और उसके Time:Subjectगुणांकों दोनों के योग द्वारा 82.06 के औसत मूल्य से भिन्न होगा :

82.06+17.39+33.04=132.49

जो मुझे लगता है कि 132.46 की गोलाई त्रुटि के भीतर है।

इंटरसेप्ट वैल्यूज द्वारा लौटाए गए इंटरसेप्ट वैल्यू coefपूरे इंटरसेप्ट प्लस Subjectया Time:Subjectविशिष्ट अंतरों का प्रतिनिधित्व करते हैं , इसलिए उन लोगों के साथ काम करना कठिन है; यदि आपने उपरोक्त गणना को उन coefमूल्यों के साथ करने की कोशिश की है जो आप समग्र अवरोधन की दोहरी गणना करेंगे।


धन्यवाद! यह बकाया था! मैं इसे खोलने छोड़ने में कोई मतलब नहीं है ... यह वह जगह है नहीं लगता कि इस सवाल का जवाब, हैं ना?
एंटोनी परेलाडा

मुझे ranefआर कोड की जांच करने के बारे में संकेत मिला lme4। मैंने कुछ स्थानों पर प्रस्तुति को स्पष्ट किया।
एड्म

(+1) ध्यान दें: किसी व्यक्ति के भीतर निहित समय यादृच्छिक प्रभाव किसी तरह अजीब लगता है।
माइकल एम।

@MichaelM: हां, जैसा कि प्रस्तुत किया गया डेटा नेस्टेड डिज़ाइन के बजाय एक क्रॉस (टाइम x विषय) प्रतीत होता है, लेकिन यह वह तरीका है जिससे ओपी ने सवाल उठाया कि lme4आउटपुट की व्याख्या कैसे करें । इसके अलावा, प्रस्तुत आंकड़ों का विश्लेषण करने के लिए एक वास्तविक अध्ययन होने के बजाय चित्रण के लिए लग रहा था।
एड्म
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.