Lojistik regresyon için yapay veriler nasıl simüle edilir?


45

Lojistik regresyon anlayışımda bir şeyleri özlediğimi biliyorum ve gerçekten herhangi bir yardım için minnettar olurum.

Anladığım kadarıyla, lojistik regresyon girdiler için verilen '1' sonucunun olasılığının, ters-lojistik fonksiyonundan geçen girdilerin doğrusal bir birleşimi olduğunu varsayar. Bu, aşağıdaki R kodunda örneklenmiştir:

#create data:
x1 = rnorm(1000)           # some continuous variables 
x2 = rnorm(1000)
z = 1 + 2*x1 + 3*x2        # linear combination with a bias
pr = 1/(1+exp(-z))         # pass through an inv-logit function
y = pr > 0.5               # take as '1' if probability > 0.5

#now feed it to glm:
df = data.frame(y=y,x1=x1,x2=x2)
glm =glm( y~x1+x2,data=df,family="binomial")

ve aşağıdaki hata iletisini alıyorum:

Uyarı mesajları: 1: glm.fit: algoritması 2: glm.fit: takılmış olasılıkları sayısal olarak 0 ya da 1 oluşmadı

Bir süredir R ile çalıştım; muhtemelen suçlayacak olan benim olduğumu bilecek kadar .. burada neler oluyor?


2
Verilerinizi simüle etme şekliniz bana tuhaf geliyor. İsterseniz, daha standart bir yol için, buraya bakabilirsiniz: stats.stackexchange.com/questions/12857/…
ocram

@ ocram: haklısın; bu yinelenen bir soru!
kullanıcı603

2
@ Stéphane Laurent'in açıkladığı gibi hatalı bir simülasyon yaptım. Bununla birlikte, sorun lojistik regresyonda mükemmel bir ayrımdı , aşina olmadığım ve öğrendiğim için oldukça şaşırdım.
zorbar

@zorbar: soruma cevabımdaydı (şimdi silindi).
user603

1
@ user603: Muhtemelen cevabını kaçırdım; Yine de teşekkürler
zorbar

Yanıtlar:


63

yi1pr(i)

> set.seed(666)
> x1 = rnorm(1000)           # some continuous variables 
> x2 = rnorm(1000)
> z = 1 + 2*x1 + 3*x2        # linear combination with a bias
> pr = 1/(1+exp(-z))         # pass through an inv-logit function
> y = rbinom(1000,1,pr)      # bernoulli response variable
> 
> #now feed it to glm:
> df = data.frame(y=y,x1=x1,x2=x2)
> glm( y~x1+x2,data=df,family="binomial")

Call:  glm(formula = y ~ x1 + x2, family = "binomial", data = df)

Coefficients:
(Intercept)           x1           x2  
     0.9915       2.2731       3.1853  

Degrees of Freedom: 999 Total (i.e. Null);  997 Residual
Null Deviance:      1355 
Residual Deviance: 582.9        AIC: 588.9 

Haklısın - Bu adımı kaçırdım. yardımın için çok teşekkürler!
zorbar

1
Verileri nasıl taklit edeceğinizle ilgili bir sorum vardı. Doğrusal regresyon için veri simülasyonu yaptığımızda, aynı zamanda bir gürültüyü de simüle ederiz (\ epsilon). Lojistik fonksiyonunun, gürültüyü kendiliğinden iptal eden beklentinin bir fonksiyonu olduğunu anlıyorum. Z'nizde gürültü olmaması nedeni bu mu?
Sam

5
mean response+noise

@ StéphaneLaurent, tam olarak. Tamamen anladım. Cevabınız için çok teşekkürler.
Sam

2

LogisticRegression, olasılıklar veya oranlar sadece 0/1 sonuç değil, hedef olarak sağlanmışsa, montaj için uygundur.

import numpy as np
import pandas as pd
def logistic(x, b, noise=None):
    L = x.T.dot(b)
    if noise is not None:
        L = L+noise
    return 1/(1+np.exp(-L))

x = np.arange(-10., 10, 0.05)
bias = np.ones(len(x))
X = np.vstack([x,bias]) # Add intercept
B =  [1., 1.] # Sigmoid params for X

# True mean
p = logistic(X, B)
# Noisy mean
pnoisy = logistic(X, B, noise=np.random.normal(loc=0., scale=1., size=len(x)))
# dichotomize pnoisy -- sample 0/1 with probability pnoisy
dichot = np.random.binomial(1., pnoisy)

pd.Series(p, index=x).plot(style='-')
pd.Series(pnoisy, index=x).plot(style='.')
pd.Series(dichot, index=x).plot(style='.')

Burada lojistik regresyon için üç potansiyel hedefimiz var. pBu gerçek oran / olasılık oranı / olasılık, pnoisylog odds skalasına eklenmiş normal gürültü dichotile p'dir ve binom PDF'ye bir parametre olarak kabul edilen ve ondan örneklenmiş olan pnoisy'dir. 3'ü de test etmelisiniz - bazı açık kaynaklı LR uygulamalarının uymayacağını gördüm p.

Uygulamanıza bağlı olarak, gürültülü tercih edebilirsiniz.

Uygulamada, ayrıca gürültü ne kadar düşünmelisiniz olasılıkla uygulamayı hedefleyen ve bu taklit deneyin şekillendirilecek.

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.