Lojistik regresyondan tahmin edilen olasılıklar için güven aralıklarının çizilmesi


20

Tamam, lojistik regresyonum var ve predict()tahminlerime dayanarak bir olasılık eğrisi geliştirmek için bu fonksiyonu kullandım .

## 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")

Bu harika ama olasılıklar için güven aralıklarını çizmeyi merak ediyorum. Denedim plot.ci()ama hiç şansım yoktu. Birisi beni bunu yapmanın bazı yollarına, tercihen carpaket veya R tabanına işaret edebilir mi?


4
(+1) Konu dışı olarak kapatılacak oylara yanıt olarak: Görünüşe göre bu oyların temeli, sorunun tamamen yazılımla ilgili bir soru sormasıdır ("R ve benzeri şeyler nasıl çizilir"), gerçekten SO üzerinde görünmesi gereken bir soru. Bununla birlikte, mevcut cevapta gömülü olanın, çizim noktalarını oluşturmak için istatistiksel formüller olduğunu unutmayın. Bu, soruya istatistiksel bir ilgi olduğunu göstermektedir, bu yüzden göç için oy kullanmak konusunda isteksizim. Burada iyi bir cevap bu istatistiksel noktayı vurgulayıp açıklayacaktır.
whuber

Yanıtlar:


26

Kullandığınız kod, glmişlevi kullanarak bir lojistik regresyon modelini tahmin eder. Veri eklemedin, bu yüzden biraz telafi edeceğim.

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"))

Bir lojistik regresyon modeli, ikili tepki değişkeni ile bu durumda bir sürekli yordayıcı arasındaki ilişkiyi modeller. Sonuç, yordayıcıyla doğrusal bir ilişki olarak logit dönüşümü olasılığıdır. Sizin durumunuzda, sonuç, kumar kazanma veya kazanmamaya karşılık gelen ikili bir yanıttır ve bahsin değeri ile tahmin edilir. 'Den gelen katsayılar, mod1kaydedilen oranlarda (yorumlanması zor olan) verilir:

lojit(p)=günlük(p(1-p))=β0+β1x1

Kayıtlı olasılıkları olasılıklara dönüştürmek için yukarıdakileri

p=tecrübe(β0+β1x1)(1+tecrübe(β0+β1x1))

Grafiği ayarlamak için bu bilgileri kullanabilirsiniz. İlk olarak, bir dizi tahmin değişkeni gerekir:

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

Ardından predict, modelinize dayalı tahminler alabilirsiniz.

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

Takılan değerlerin ayrıca

mod1$fitted

Belirterek se.fit=TRUE, her takılan değerle ilişkili standart hatayı da alırsınız. Sonuçta data.frameaşağıdaki bileşenlere sahip bir matris bulunur: takılan tahminler ( fit), tahmini standart hatalar ( se.fit) ve standart hataları hesaplamak için kullanılan dağılımın kare kökünü veren bir skaler ( residual.scale). Bir binom logit durumunda, değer olacaktır 1 (siz girerek görebileceğiniz preddat$residual.scaleiçinde R). Şimdiye kadar hesapladığınız şeyin bir örneğini görmek istiyorsanız, yazabilirsiniz head(data.frame(preddat)).

Bir sonraki adım, arsa oluşturmaktır. Önce parametreleri ile boş bir çizim alanı kurmak istiyorum:

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

Şimdi, takılmış olasılıkların nasıl hesaplanacağını bilmenin önemli olduğunu görebilirsiniz. Yukarıdaki ikinci formülü takip ederek takılan olasılıklara karşılık gelen çizgiyi çizebilirsiniz. Tuşunu kullanarak, preddat data.frametakılan değerleri olasılıklara dönüştürebilir ve bunu, tahmin değişkeninizin değerlerine karşı bir çizgi çizmek için kullanabilirsiniz.

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

Son olarak, sorunuzu cevaplayın, uygun değerlerin +/- 1.96standart hatanın çarpı olasılığını hesaplayarak grafiğe güven aralıkları eklenebilir :

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))

Ortaya çıkan çizim (rastgele oluşturulan verilerden) şöyle görünmelidir:

resim açıklamasını buraya girin

Uygunluk uğruna, tek bir parçadaki tüm kodlar:

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))

(Not: Bu, stats.stackexchange ile daha alakalı hale getirme girişiminde yoğun olarak düzenlenmiş bir cevaptır.)


değişken nerede se.fittanımlanır?
Makro

In predict(..., se.fit=TRUE).
17'de smillig

(-1) Bu CI'lerin her biri ayrı ayrı vakalar için mi? Eğer öyleyse, ikili bir sonuç için, öngörülen bir olasılık için tek anlamlı CI [0,1] 'dir. Bu teknik olarak yeterli bir cevap olsa da.
rolando2

@ Whuber'ın yorumuna göre, iyi bir yanıtın SE'nin nasıl hesaplandığına dair bir formül içermesi gerektiğini düşünüyorum. Birisi cevabı düzenleyebilir ve geliştirebilir mi?
Heisenberg

1
Cevabınız sadece 'ortalama tahmin aralığı' veriyor gibi görünüyor. 'Nokta tahmin aralığını' nasıl eklerim?
Bob Hopez

0

İşte @ smillig'in çözümünün bir modifikasyonu. Burada tidyverse araçları kullanıyorum ve ayrıca linkinvGLM model nesnesinin bir parçası olan işlevi kullanıyorum mod1. Bu şekilde, lojistik işlevi manuel olarak tersine çevirmek zorunda kalmazsınız ve bu yaklaşım hangi belirli GLM'ye uyduğunuzdan bağımsız olarak çalışır.

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
Uygulama genellikle sorulardaki önemli içerikle karıştırılsa da, kod değil istatistik, makine öğrenimi vb. Hakkında bilgi sağlamak için bir site olmamız gerekir. Kod sağlamak da iyi olabilir, ancak bu dili koddan cevabı tanıyacak ve çıkaracak kadar iyi okuyan insanlar için lütfen metindeki önemli cevabınızı hazırlayın.
gung - Monica'yı eski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.