आर में लमर () मिश्रित प्रभाव मॉडल के लिए भविष्यवाणी अंतराल


37

मैं एक lmer () मॉडल से एक भविष्यवाणी के आसपास एक भविष्यवाणी अंतराल प्राप्त करना चाहता हूं। मुझे इस बारे में कुछ चर्चा मिली है:

http://rstudio-pubs-static.s3.amazonaws.com/24365_2803ab8299934e888a60e7b16113f619.html

http://glmm.wikidot.com/faq

लेकिन वे यादृच्छिक प्रभावों की अनिश्चितता को ध्यान में नहीं रखते हैं।

यहाँ एक विशिष्ट उदाहरण है। मैं सोने की मछली की दौड़ लगा रहा हूं। मेरे पास पिछले 100 दौड़ के आंकड़े हैं। मैं अपने आरई अनुमानों, और एफई अनुमानों की अनिश्चितता को ध्यान में रखते हुए 101 वीं भविष्यवाणी करना चाहता हूं। मैं मछली के लिए एक यादृच्छिक अवरोधक (10 अलग-अलग मछली हैं) शामिल हूं, और वजन के लिए निश्चित प्रभाव (कम भारी मछली जल्दी)।

library("lme4")

fish <- as.factor(rep(letters[1:10], each=100))
race <- as.factor(rep(900:999, 10))
oz <- round(1 + rnorm(1000)/10, 3)
sec <- 9 + rep(1:10, rep(100,10))/10 + oz + rnorm(1000)/10

fishDat <- data.frame(fishID = fish, 
      raceID = race, fishWt = oz, time = sec)
head(fishDat)
plot(fishDat$fishID, fishDat$time)

lme1 <- lmer(time ~ fishWt + (1 | fishID), data=fishDat)
summary(lme1)

अब, 101 वीं दौड़ की भविष्यवाणी करने के लिए। मछली का वजन किया गया है और जाने के लिए तैयार हैं:

newDat <- data.frame(fishID = letters[1:10], 
    raceID = rep(1000, 10),
    fishWt = 1 + round(rnorm(10)/10, 3))
newDat$pred <- predict(lme1, newDat)
newDat

   fishID raceID fishWt     pred
1       a   1000  1.073 10.15348
2       b   1000  1.001 10.20107
3       c   1000  0.945 10.25978
4       d   1000  1.110 10.51753
5       e   1000  0.910 10.41511
6       f   1000  0.848 10.44547
7       g   1000  0.991 10.68678
8       h   1000  0.737 10.56929
9       i   1000  0.993 10.89564
10      j   1000  0.649 10.65480

फिश डी ने वास्तव में खुद को (1.11 ऑउंस) जाने दिया है और वास्तव में मछली ई और मछली एफ से हारने की भविष्यवाणी की है, दोनों ही अतीत में उससे बेहतर रहे हैं। हालांकि, अब मैं यह कहना चाहता हूं कि, "फिश ई (0.91 वज़न) का वजन फिश डी (1.11 वज़न) की संभावना पी के साथ होगा।" क्या lme4 का उपयोग करके इस तरह का बयान देने का कोई तरीका है? मैं चाहता हूं कि मेरी संभावना पी निश्चित प्रभाव, और यादृच्छिक प्रभाव दोनों में मेरी अनिश्चितता को ध्यान में रखे।

धन्यवाद!

पुनश्च predict.merModदस्तावेज़ीकरण को देखते हुए, यह सुझाव देता है "भविष्यवाणियों की मानक त्रुटियों की गणना करने के लिए कोई विकल्प नहीं है क्योंकि एक कुशल विधि को परिभाषित करना मुश्किल है जो कि प्रसरण मापदंडों में अनिश्चितता को शामिल करता है; हम bootMerइस कार्य के लिए सलाह देते हैं ," लेकिन मैं जोश से नहीं देख सकता। यह करने के लिए कैसे उपयोग bootMerकरें। ऐसा लगता है bootMerकि पैरामीटर अनुमानों के लिए बूटस्ट्रैप्ड आत्मविश्वास अंतराल प्राप्त करने के लिए उपयोग किया जाएगा, लेकिन मैं गलत हो सकता है।

अद्यतन प्रश्न:

ठीक है, मुझे लगता है कि मैं गलत सवाल पूछ रहा था। मैं यह कहने में सक्षम होना चाहता हूं, "मछली ए, जिसका वजन ओ ओज़ है, एक दौड़ समय होगा (lcl, ucl) 90% समय।"

उदाहरण के तौर पर, मैंने फिश ए को 1.0 औंस वजन दिया है 9 + 0.1 + 1 = 10.1 sec, जिसमें 0.1 की मानक विचलन के साथ औसतन एक रेस समय होगा । इस प्रकार, उसकी मनाया दौड़ समय के बीच होगी

x <- rnorm(mean = 10.1, sd = 0.1, n=10000)
quantile(x, c(0.05,0.50,0.95))
       5%       50%       95% 
 9.938541 10.100032 10.261243 

90% समय। मुझे एक भविष्यवाणी समारोह चाहिए जो मुझे उस उत्तर देने का प्रयास करे। सभी fishWt = 1.0को newDatफिर से चलाना, और फिर (बेन बोलकर नीचे सुझाए अनुसार) सिम का उपयोग करना

predFun <- function(fit) {
  predict(fit,newDat)
}
bb <- bootMer(lme1,nsim=1000,FUN=predFun, use.u = FALSE)
predMat <- bb$t

देता है

> quantile(predMat[,1], c(0.05,0.50,0.95))
      5%      50%      95% 
10.01362 10.55646 11.05462 

ऐसा लगता है कि वास्तव में जनसंख्या औसत के आसपास केंद्रित है? जैसे कि यह फिशआईडी प्रभाव को ध्यान में नहीं रख रहा है? मैंने सोचा कि शायद यह एक नमूना आकार का मुद्दा था, लेकिन जब मैंने 100 से 10000 तक देखी गई दौड़ की संख्या को टकराया, तब भी मुझे इसी तरह के परिणाम मिलते हैं।

मैं डिफ़ॉल्ट रूप से bootMerउपयोग पर ध्यान दूंगा use.u=FALSE। फ्लिप पक्ष पर, का उपयोग कर

bb <- bootMer(lme1,nsim=1000,FUN=predFun, use.u = TRUE)

देता है

> quantile(predMat[,1], c(0.05,0.50,0.95))
      5%      50%      95% 
10.09970 10.10128 10.10270 

यह अंतराल बहुत संकीर्ण है, और मछली ए के औसत समय के लिए एक आत्मविश्वास अंतराल प्रतीत होगा। मैं फिश ए के प्रेक्षित रेस समय के लिए एक आत्मविश्वास अंतराल चाहता हूं, न कि उसकी औसत रेस का समय। मुझे वह कैसे मिल सकता है?

अद्यतन 2, ALMOST:

मैंने सोचा कि मुझे गेलमैन और हिल (2007) , पृष्ठ 273 में जो मैं देख रहा था वह मिला arm। पैकेज का उपयोग करने की आवश्यकता है ।

library("arm")

मछली ए के लिए:

x.tilde <- 1    #observed fishWt for new race
sigma.y.hat <- sigma.hat(lme1)$sigma$data        #get uncertainty estimate of our model
coef.hat <- as.matrix(coef(lme1)$fishID)[1,]    #get intercept (random) and fishWt (fixed) parameter estimates
y.tilde <- rnorm(1000, coef.hat %*% c(1, x.tilde), sigma.y.hat) #simulate
quantile (y.tilde, c(.05, .5, .95))

  5%       50%       95% 
 9.930695 10.100209 10.263551 

सभी मछलियों के लिए:

x.tilde <- rep(1,10)  #assume all fish weight 1 oz
#x.tilde <- 1 + rnorm(10)/10  #alternatively, draw random weights as in original example
sigma.y.hat <- sigma.hat(lme1)$sigma$data
coef.hat <- as.matrix(coef(lme1)$fishID)
y.tilde <- matrix(rnorm(1000, coef.hat %*% matrix(c(rep(1,10), x.tilde), nrow = 2 , byrow = TRUE), sigma.y.hat), ncol = 10, byrow = TRUE)
quantile (y.tilde[,1], c(.05, .5, .95))
       5%       50%       95% 
 9.937138 10.102627 10.234616 

वास्तव में, यह संभवतः वैसा नहीं है जैसा मैं चाहता हूं। मैं केवल समग्र मॉडल अनिश्चितता को ध्यान में रख रहा हूं। ऐसी स्थिति में, जहां मैंने कहा है, फिश K के लिए 5 प्रेक्षित दौड़ और फिश L के लिए 1000 प्रेक्षित जातियाँ हैं, मुझे लगता है कि फिश K के लिए मेरी भविष्यवाणी से जुड़ी अनिश्चितता, फ़िश L के लिए मेरी भविष्यवाणी से जुड़ी अनिश्चितता से बहुत बड़ी होनी चाहिए।

गेलमैन और हिल 2007 में आगे देखेंगे। मुझे लगता है कि मैं बीयूजीएस (या स्टेन) पर स्विच करने के लिए समाप्त हो सकता हूं।

अद्यतन 3:

शायद मैं चीजों को खराब तरीके से समझ रहा हूं। predictInterval()नीचे दिए गए जवाब में जेरेड नोल्स द्वारा दिए गए फ़ंक्शन का उपयोग करने से अंतराल मिलता है जो कि मुझे उम्मीद नहीं है ...

library("lattice")
library("lme4")
library("ggplot2")

fish <- c(rep(letters[1:10], each = 100), rep("k", 995), rep("l", 5))
oz <- round(1 + rnorm(2000)/10, 3)
sec <- 9 + c(rep(1:10, each = 100)/10,rep(1.1, 995), rep(1.2, 5)) + oz + rnorm(2000)

fishDat <- data.frame(fishID = fish, fishWt = oz, time = sec)
dim(fishDat)
head(fishDat)
plot(fishDat$fishID, fishDat$time)

lme1 <- lmer(time ~ fishWt + (1 | fishID), data=fishDat)
summary(lme1)
dotplot(ranef(lme1, condVar = TRUE))

मैंने दो नई मछलियाँ जोड़ी हैं। फिश के, जिनके लिए हमने 995 रेस देखी हैं, और फिश एल, जिनके लिए हमने 5 रेस देखी हैं। हमने फिश एजे के लिए 100 रेस देखी हैं। मैं lmer()पहले की तरह ही फिट हूं । पैकेज dotplot()से देख रहे हैं lattice:

फिशआईडी अनुमान लगाता है

डिफ़ॉल्ट रूप से, dotplot()उनके बिंदु अनुमान द्वारा यादृच्छिक प्रभावों को पुन: व्यवस्थित करता है। मछली एल के लिए अनुमान शीर्ष रेखा पर है, और एक बहुत व्यापक आत्मविश्वास अंतराल है। मछली कश्मीर तीसरी पंक्ति पर है, और इसमें बहुत ही संकीर्ण आत्मविश्वास अंतराल है। मुझे यह अर्थपूर्ण लग रहा है। हमारे पास फ़िश के पर बहुत सारे डेटा हैं, लेकिन फ़िश एल पर बहुत अधिक डेटा नहीं है, इसलिए हम फ़िश के की सही तैराकी गति के बारे में अपने अनुमान में अधिक आश्वस्त हैं। अब, मुझे लगता है कि यह मछली कश्मीर के लिए एक संकीर्ण भविष्यवाणी अंतराल और मछली एल के लिए एक व्यापक भविष्यवाणी अंतराल का उपयोग करते समय होगा predictInterval()। Howeva:

newDat <- data.frame(fishID = letters[1:12],
                     fishWt = 1)

preds <- predictInterval(lme1, newdata = newDat, n.sims = 999)
preds
ggplot(aes(x=letters[1:12], y=fit, ymin=lwr, ymax=upr), data=preds) +
  geom_point() + 
  geom_linerange() +
  labs(x="Index", y="Prediction w/ 95% PI") + theme_bw()

मछली के लिए भविष्यवाणी अंतराल

वे सभी भविष्यवाणी अंतराल चौड़ाई में समान प्रतीत होते हैं। क्यों मछली कश्मीर के लिए हमारी भविष्यवाणी दूसरों को संकीर्ण नहीं है? क्यों मछली एल के लिए हमारी भविष्यवाणी दूसरों की तुलना में व्यापक नहीं है?


1
predictIntervalइसमें फिक्स्ड और रैंडम इफेक्ट दोनों शब्दों के लिए त्रुटि / अनिश्चितता शामिल है। में dotplotआप केवल भविष्यवाणी के यादृच्छिक भाग, अनिवार्य रूप से मछली विशिष्ट अवरोध के अनुमान में लगभग अनिश्चितता की वजह से अनिश्चितता देख रहे हैं। यदि आपके मॉडल में निर्धारित पैरामीटर में बहुत अधिक अनिश्चितता है fishWtऔर यह पैरामीटर अधिकांश अनुमानित मूल्य पर ड्राइव करता है, तो किसी भी विशिष्ट मछली अवरोधन के आसपास अनिश्चितता तुच्छ है और आपको अंतराल की चौड़ाई में बड़ा अंतर नहीं दिखेगा। हमें predictIntervalपरिणामों में इसे और स्पष्ट करना चाहिए ।
jknowles

जवाबों:


18

यह प्रश्न और उत्कृष्ट विनिमय पैकेज predictIntervalमें फ़ंक्शन बनाने के लिए प्रेरणा था merToolsbootMerजाने का रास्ता है, लेकिन कुछ समस्याओं के लिए पूरे मॉडल के बूटस्ट्रैप्ड रिफिट्स उत्पन्न करना संभव नहीं है (उन मामलों में जहां मॉडल बड़ा है)।

उन मामलों में, मॉडल में मापदंडों के वितरण को उत्पन्न करने के predictIntervalलिए arm::simफ़ंक्शंस का उपयोग करने और फिर newdataउपयोगकर्ता द्वारा प्रदान की गई प्रतिक्रिया के सिम्युलेटेड मूल्यों को उत्पन्न करने के लिए उन वितरणों का उपयोग करने के लिए डिज़ाइन किया गया है । इसका उपयोग करना सरल है - आपको बस इतना करना होगा:

library(merTools)
preds <- predictInterval(lme1, newdata = newDat, n.sims = 999)

आप predictIntervalभविष्यवाणी अंतराल के लिए अंतराल सेट करने सहित, वितरण के माध्य या माध्यिका को रिपोर्ट करने के लिए और मॉडल से अवशिष्ट विचरण को शामिल करने के लिए चुन सकते हैं या नहीं सहित अन्य मूल्यों की एक पूरी मेजबानी को निर्दिष्ट कर सकते हैं ।

यह एक पूर्ण पूर्वानुमान अंतराल नहीं है क्योंकि ऑब्जेक्ट thetaमें मापदंडों की परिवर्तनशीलता lmerशामिल नहीं है, लेकिन इस पद्धति के माध्यम से अन्य सभी भिन्नताएं कैप्चर की जाती हैं, जो एक बहुत ही सभ्य सन्निकटन देती हैं।


3
यह कमाल लग रहा है! अब विगनेट के माध्यम से पढ़ना । धन्यवाद!
19

भविष्यवाणी अंतराल काफी मैं क्या उम्मीद नहीं कर रहे हैं। अद्यतन 3 ऊपर देखें।
१६:०५ पर असंभव ossible

क्या predictInterval()नेस्ट यादृच्छिक प्रभाव की तरह नहीं है? उदाहरण के लिए, पैकेज msleepसे डेटासेट का उपयोग करना ggplot2: mod <- lmer(sleep_total ~ bodywt + (1|vore/order), data=msleep); predInt <- predictInterval(merMod=mod, newdata=msleep) एक त्रुटि लौटाता है:Error in '[.data.frame'(newdata, , j) : undefined columns selected
असंभव

मैं शर्त लगाता हूं कि इसे नेस्टेड प्रभाव पसंद नहीं है। मुझे नहीं लगता कि हमारे टेस्ट सूट में इसका कोई टेस्ट था। मैं उस पर गौर करने के लिए GitHub पर एक समस्या दर्ज करूंगा। मैं भी devtools::install_github("jknowles/merTools")पहले GitHub से देव संस्करण की कोशिश कर रहा हूँ ।
jknowles

2
एक अद्यतन के रूप में, merTools का नवीनतम विकास संस्करण नेस्टेड प्रभाव की अनुमति देता है। इसे जल्द ही CRAN के लिए धकेल दिया जाएगा।
jknowles

15

bootMerप्रत्येक पैरामीट्रिक बूटस्ट्रैप प्रतिकृति के लिए भविष्यवाणियों का एक सेट बनाकर ऐसा करें :

predFun <- function(fit) {
    predict(fit,newDat)
}
bb <- bootMer(lme1,nsim=200,FUN=predFun,seed=101)

का उत्पादन bootMerएक बहुत ही पारदर्शी "boot"वस्तु में नहीं है, लेकिन हम कच्चे भविष्यवाणियों को $tघटक से बाहर निकाल सकते हैं ।

फिश E ने फिश D को कितना समय दिया?

predMat <- bb$t
dim(predMat) ## 200 rows (PB reps) x 10 (predictions)

मछली E का काल स्तंभ 5 में है, मछली D का काल स्तंभ 4 में हैं, इसलिए हमें केवल यह जानना होगा कि स्तंभ 5 स्तंभ 4 से कम है:

mean(predMat[,5]<predMat[,4])  ## 0.57

मुझे कुछ अप्रत्याशित परिणाम मिल रहे हैं। यदि मैं newDat में सभी मछलियों के लिए fishWt = 1 सेट करता हूं, तो मैं मछली A के लिए माध्य / माध्य समय की उम्मीद करूंगा ~ 10.1, मछली B ~ 10.2, ..., Fish J ~ 11.0 (प्रशिक्षण डेटा में उनके समय से) के रूप में परिभाषित:) sec <- 9 + rep(1:10, rep(100,10))/10 + oz + rnorm(1000)/10। जब मैं उपयोग करता हूं predict(), मछली ए, ई, और जे के लिए भविष्यवाणी समय 10.09, 10.49, और 10.99, जैसा कि अपेक्षित था। हालाँकि, बूटमर विधि के लिए माध्य समय आप हैं: 10.52, 10.59 और 10.50। मुझे अधिक समझौते की उम्मीद होगी?
२३:१५ बजे २२:३५

में प्रयोग के use.u=TRUEरूप में: bb <- bootMer(lme1,nsim=200,FUN=predFun,seed=101,use.u=TRUE)मुझे लगता है कि मैं क्या चाहते हैं देने के लिए लगता है। धन्यवाद!
1

ठीक है, यह थोड़ा मुश्किल हो जाता है। आपको use.uतर्क को देखने की जरूरत है bootMer। सवाल यह है कि जब आप कहते हैं "निश्चित प्रभाव में अनिश्चितता और यादृच्छिक प्रभाव", तो 'यादृच्छिक प्रभाव' से आपका क्या तात्पर्य है? क्या आप बेतरतीब-प्रभाव वाले विचरण में अनिश्चितता का मतलब है , या सशर्त मोड में (यानी मछली-विशिष्ट प्रभाव)? आप उपयोग कर सकते हैं use.u=TRUE, लेकिन मुझे नहीं लगता कि यह जरूरी होगा कि आप क्या चाहते हैं ...
बेन बोल्कर

अगर मैं उपयोग करता हूं use.u=TRUE, तो "यू के मूल्य [ठहरें] उनके अनुमानित मूल्यों पर तय"। मैं इसे अर्थ के रूप में व्याख्या करता हूं, जो भी मछली ए के लिए हमारे यादृच्छिक प्रभाव बिंदु का अनुमान है, यह भगवान के ईमानदार सत्य के रूप में लिया जाता है, यदि आप करेंगे। bootMerमानता है कि हमारे आरई बिंदु अनुमान में कोई त्रुटि नहीं है। अगर मैं उपयोग use.u=FALSEकरता हूं , bootMerतो आरई बिंदु अनुमानों को ध्यान में रखता है? ऐसा लगता है bootMerपरिणामों का उपयोग करते समय use.u=FALSEका उपयोग कर के बराबर हैं (या, asymptotically समतुल्य) re.form=NAमें predict()बयान। क्या यह सच है?
संभव है

1
मुझे लगता है कि यह एटीएम लागू नहीं किया गया है, लेकिन आप सशर्त मोड / BLUPs के सशर्त संस्करण को निकाल सकते हैं c(attr(ranef(lme1,condVar=TRUE)[[1]],"postVar"))(वे इस उदाहरण में सभी समान हैं), और फिर उन मूल्यों का नमूना लेते हैं।
बेन बोल्कर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.