एक लॉजिस्टिक प्रतिगमन से अनुमानित संभावनाओं के लिए आत्मविश्वास अंतराल को प्लॉट करना


20

ठीक है, मेरे पास एक लॉजिस्टिक रिग्रेशन है और predict()अपने अनुमानों के आधार पर प्रायिकता वक्र विकसित करने के लिए फ़ंक्शन का उपयोग किया है ।

## LOGIT MODEL:
library(car)
mod1 = glm(factor(won) ~ as.numeric(bid), data=mydat, family=binomial(link="logit"))

## PROBABILITY CURVE:
all.x <- expand.grid(won=unique(won), bid=unique(bid))
y.hat.new <- predict(mod1, newdata=all.x, type="response")
plot(bid<-000:1000,predict(mod1,newdata=data.frame(bid<-c(000:1000)),type="response"), lwd=5, col="blue", type="l")

यह बहुत अच्छा है लेकिन मैं संभावनाओं के लिए विश्वास अंतराल की साजिश के बारे में उत्सुक हूं। मैंने कोशिश की है, plot.ci()लेकिन कोई भाग्य नहीं था। क्या कोई मुझे इसे पूरा करने के लिए कुछ तरीकों से इंगित कर सकता है, अधिमानतः carपैकेज या बेस आर के साथ ।


4
(+1) टॉपिक के अनुसार वोटों को बंद करने के जवाब में: जाहिर तौर पर उन वोटों का आधार यह है कि यह सवाल विशुद्ध रूप से सॉफ्टवेयर से संबंधित सवाल ("कैसे और कैसे आर में प्लॉट किया जाए"), प्रश्न जो वास्तव में SO पर प्रदर्शित होना चाहिए। हालाँकि, ध्यान दें कि वर्तमान उत्तर में दफन प्लॉटिंग पॉइंट बनाने के लिए सांख्यिकीय सूत्र हैं । इससे पता चलता है कि प्रश्न के लिए सांख्यिकीय रुचि है, इसलिए मैं प्रवास के लिए मतदान करने के लिए अनिच्छुक हूं। यहां एक अच्छा जवाब इस सांख्यिकीय बिंदु को उजागर करेगा और समझाएगा।
whuber

जवाबों:


26

आपके द्वारा उपयोग किया गया कोड glmफ़ंक्शन का उपयोग करके लॉजिस्टिक रिग्रेशन मॉडल का अनुमान लगाता है । आपने डेटा शामिल नहीं किया है, इसलिए मैं अभी कुछ बनाऊंगा।

set.seed(1234)
mydat <- data.frame(
    won=as.factor(sample(c(0, 1), 250, replace=TRUE)), 
    bid=runif(250, min=0, max=1000)
)
mod1 <- glm(won~bid, data=mydat, family=binomial(link="logit"))

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

logit(p)=log(p(1p))=β0+β1x1

लॉग ऑड्स को संभावनाओं में परिवर्तित करने के लिए, हम ऊपर से अनुवाद कर सकते हैं

p=exp(β0+β1x1)(1+exp(β0+β1x1))

आप इस जानकारी का उपयोग प्लॉट सेट करने के लिए कर सकते हैं। सबसे पहले, आपको भविष्यवक्ता चर की एक श्रृंखला की आवश्यकता है:

plotdat <- data.frame(bid=(0:1000))

फिर उपयोग करते हुए predict, आप अपने मॉडल के आधार पर भविष्यवाणियां प्राप्त कर सकते हैं

preddat <- predict(mod1, newdata=plotdat, se.fit=TRUE)

ध्यान दें कि फिट किए गए मान भी प्राप्त किए जा सकते हैं

mod1$fitted

निर्दिष्ट करके se.fit=TRUE, आपको प्रत्येक फिट किए गए मान के साथ मानक त्रुटि भी मिलती है। परिणामी data.frameनिम्नलिखित घटकों के साथ एक मैट्रिक्स है: फिट की गई भविष्यवाणियां ( fit), अनुमानित मानक त्रुटियां ( se.fit), और मानक त्रुटियों को गणना करने के लिए उपयोग किए जाने वाले फैलाव के वर्गमूल देने वाला एक स्केलर residual.scale। एक द्विपद logit के मामले में, मूल्य हो जाएगा 1 (आप दर्ज करके देख सकते हैं जो preddat$residual.scaleमें R)। यदि आप अब तक की गणना का एक उदाहरण देखना चाहते हैं, तो आप टाइप कर सकते हैं head(data.frame(preddat))

अगला कदम भूखंड स्थापित करना है। मैं पहले मापदंडों के साथ एक खाली प्लॉटिंग क्षेत्र स्थापित करना पसंद करता हूं:

with(mydat, plot(bid, won, type="n", 
    ylim=c(0, 1), ylab="Probability of winning", xlab="Bid"))

अब आप देख सकते हैं कि फिट की गई संभावनाओं की गणना करना जानना महत्वपूर्ण है। आप ऊपर दिए गए दूसरे सूत्र के बाद फिट की गई संभावनाओं के अनुरूप रेखा खींच सकते हैं। preddat data.frameआप का उपयोग करके फिट किए गए मानों को संभाव्यता में परिवर्तित कर सकते हैं और उपयोग कर सकते हैं कि अपने भविष्यवक्ता चर के मूल्यों के खिलाफ एक पंक्ति बनाने के लिए।

with(preddat, lines(0:1000, exp(fit)/(1+exp(fit)), col="blue"))

अंत में, अपने प्रश्न का उत्तर दें, +/- 1.96मानक समय के अनुसार फिट किए गए मूल्यों की संभावना की गणना करके विश्वास अंतराल को साजिश में जोड़ा जा सकता है :

with(preddat, lines(0:1000, exp(fit+1.96*se.fit)/(1+exp(fit+1.96*se.fit)), lty=2))
with(preddat, lines(0:1000, exp(fit-1.96*se.fit)/(1+exp(fit-1.96*se.fit)), lty=2))

परिणामी भूखंड (बेतरतीब ढंग से उत्पन्न डेटा से) कुछ इस तरह दिखना चाहिए:

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

शीघ्रता के लिए, यहां एक ही कोड में सभी कोड हैं:

set.seed(1234)
mydat <- data.frame(
    won=as.factor(sample(c(0, 1), 250, replace=TRUE)), 
    bid=runif(250, min=0, max=1000)
)
mod1 <- glm(won~bid, data=mydat, family=binomial(link="logit"))
plotdat <- data.frame(bid=(0:1000))
preddat <- predict(mod1, newdata=plotdat, se.fit=TRUE)
with(mydat, plot(bid, won, type="n", 
    ylim=c(0, 1), ylab="Probability of winning", xlab="Bid"))
with(preddat, lines(0:1000, exp(fit)/(1+exp(fit)), col="blue"))
with(preddat, lines(0:1000, exp(fit+1.96*se.fit)/(1+exp(fit+1.96*se.fit)), lty=2))
with(preddat, lines(0:1000, exp(fit-1.96*se.fit)/(1+exp(fit-1.96*se.fit)), lty=2))

(नोट: यह आँकड़े.स्टैकएक्सचेंज के लिए अधिक प्रासंगिक बनाने के प्रयास में एक बहुत ही संपादित उत्तर है।)


चर को कहाँ se.fitपरिभाषित किया गया है?
मैक्रो

में predict(..., se.fit=TRUE)
स्मिलिग

(-1) ये सीआई व्यक्तिगत मामलों के लिए प्रत्येक के लिए हैं? यदि ऐसा है, तो एक द्विआधारी परिणाम के लिए, अनुमानित संभावना के लिए एकमात्र समझदार सीआई [0,1] है। हालांकि यह एक तकनीकी रूप से कुशल जवाब हो सकता है।
rolando2

@ व्हिबर की टिप्पणी के अनुसार, मुझे लगता है कि एसई की गणना कैसे की जाती है, इसके लिए एक अच्छे उत्तर में एक सूत्र शामिल होना चाहिए। क्या कोई व्यक्ति संभवतः उत्तर को संपादित और सुधार सकता है?
हाइजेनबर्ग

1
आपका जवाब सिर्फ 'मतलब भविष्यवाणी अंतराल' देने लगता है। मैं 'बिंदु पूर्वधारणा अंतराल' कैसे जोड़ूंगा?
बॉब होप्ज़

0

यहाँ @ smillig के समाधान का एक संशोधन है। मैं यहाँ tidyverse टूल का उपयोग करता हूं, और linkinvफ़ंक्शन का भी उपयोग करता हूं जो GLM मॉडल ऑब्जेक्ट का एक हिस्सा है mod1। इस तरह, आपको लॉजिस्टिक फ़ंक्शन को मैन्युअल रूप से उलटना नहीं पड़ता है, और यह दृष्टिकोण इस बात पर ध्यान दिए बिना काम करेगा कि आप क्या विशिष्ट GLM फिट करते हैं।

library(tidyverse)
library(magrittr)


set.seed(1234)

# create fake data on gambling. Does prob win depend on bid size? 
mydat <- data.frame(
  won=as.factor(sample(c(0, 1), 250, replace=TRUE)), 
  bid=runif(250, min=0, max=1000)
)

# logistic regression model: 
mod1 <- glm(won~bid, data=mydat, family=binomial(link="logit"))

# new predictor values to use for prediction: 
plotdat <- data.frame(bid=(0:1000))

# df with predictions, lower and upper limits of CIs: 
preddat <- predict(mod1,
               type = "link",
               newdata=plotdat,
               se.fit=TRUE) %>% 
  as.data.frame() %>% 
  mutate(bid = (0:1000), 

         # model object mod1 has a component called linkinv that 
         # is a function that inverts the link function of the GLM:
         lower = mod1$family$linkinv(fit - 1.96*se.fit), 
         point.estimate = mod1$family$linkinv(fit), 
         upper = mod1$family$linkinv(fit + 1.96*se.fit)) 


# plotting with ggplot: 
preddat %>% ggplot(aes(x = bid, 
                   y = point.estimate)) + 
  geom_line(colour = "blue") + 
  geom_ribbon(aes(ymin = lower,
                  ymax = upper), 
              alpha = 0.5) + 
  scale_y_continuous(limits = c(0,1))

3
यद्यपि कार्यान्वयन को अक्सर प्रश्नों में मूल सामग्री के साथ मिलाया जाता है, हमें आँकड़े, मशीन सीखने आदि के बारे में जानकारी प्रदान करने के लिए एक साइट माना जाता है, कोड नहीं। यह कोड प्रदान करने के लिए अच्छा हो सकता है, लेकिन कृपया उन लोगों के लिए पाठ में अपने उत्तर को विस्तृत करें, जो कोड से उत्तर को पहचानने और निकालने के लिए इस भाषा को अच्छी तरह से नहीं पढ़ते हैं।
गूँग - मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.