मैं एक lmer () मॉडल से एक भविष्यवाणी के आसपास एक भविष्यवाणी अंतराल प्राप्त करना चाहता हूं। मुझे इस बारे में कुछ चर्चा मिली है:
http://rstudio-pubs-static.s3.amazonaws.com/24365_2803ab8299934e888a60e7b16113f619.html
लेकिन वे यादृच्छिक प्रभावों की अनिश्चितता को ध्यान में नहीं रखते हैं।
यहाँ एक विशिष्ट उदाहरण है। मैं सोने की मछली की दौड़ लगा रहा हूं। मेरे पास पिछले 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()
वे सभी भविष्यवाणी अंतराल चौड़ाई में समान प्रतीत होते हैं। क्यों मछली कश्मीर के लिए हमारी भविष्यवाणी दूसरों को संकीर्ण नहीं है? क्यों मछली एल के लिए हमारी भविष्यवाणी दूसरों की तुलना में व्यापक नहीं है?
predictInterval
इसमें फिक्स्ड और रैंडम इफेक्ट दोनों शब्दों के लिए त्रुटि / अनिश्चितता शामिल है। मेंdotplot
आप केवल भविष्यवाणी के यादृच्छिक भाग, अनिवार्य रूप से मछली विशिष्ट अवरोध के अनुमान में लगभग अनिश्चितता की वजह से अनिश्चितता देख रहे हैं। यदि आपके मॉडल में निर्धारित पैरामीटर में बहुत अधिक अनिश्चितता हैfishWt
और यह पैरामीटर अधिकांश अनुमानित मूल्य पर ड्राइव करता है, तो किसी भी विशिष्ट मछली अवरोधन के आसपास अनिश्चितता तुच्छ है और आपको अंतराल की चौड़ाई में बड़ा अंतर नहीं दिखेगा। हमेंpredictInterval
परिणामों में इसे और स्पष्ट करना चाहिए ।