Как смоделировать искусственные данные для логистической регрессии?


45

Я знаю, что чего-то не хватает в моем понимании логистической регрессии, и буду очень признателен за любую помощь.

Насколько я понимаю, логистическая регрессия предполагает, что вероятность результата «1» с учетом входных данных представляет собой линейную комбинацию входных данных, пропущенных через обратную логистическую функцию. Это проиллюстрировано в следующем коде R:

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

и я получаю следующее сообщение об ошибке:

Предупреждающие сообщения: 1: glm.fit: алгоритм не сходится 2: glm.fit: подогнанные вероятности численно 0 или 1

Я работал с R уже некоторое время; Достаточно знать, что, вероятно, я виноват .. что здесь происходит?


2
То, как вы моделируете свои данные, выглядит странно для меня. Если вы хотите, для альтернативного более стандартного способа, вы можете посмотреть здесь: stats.stackexchange.com/questions/12857/…
ocram

@окрам: ты прав; это дублирующий вопрос!
user603

2
Я запустил ошибочную симуляцию, как объяснил @ Стефан Лоран. Однако проблема заключалась в идеальном разделении в логистической регрессии , проблема, с которой я не был знаком, и которую я был довольно удивлен, узнав о ней.
zorbar

@zorbar: это было в моем ответе на ваш вопрос (теперь удален).
user603 26.12.12

1
@ user603: Я, вероятно, пропустил ваш ответ; В любом случае, спасибо
zorbar

Ответы:


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 

Ты прав - я пропустил этот шаг. Спасибо большое за вашу помощь!
zorbar

1
У меня был вопрос относительно того, как вы моделируете данные. Когда мы моделируем данные для линейной регрессии, мы также моделируем шум (\ epsilon). Я понимаю, что логистическая функция - это функция ожидания, которая сама по себе устраняет шум. Это причина того, что у вас нет шума в вашем z?
Сэм

5
mean response+noise

@ StéphaneLaurent, точно. Я полностью понимаю. Большое спасибо за ваш ответ.
Сэм

2

LogisticRegression подходит для подгонки, если в качестве целей указаны вероятности или пропорции, а не только 0/1 результатов.

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='.')

Здесь у нас есть три потенциальных цели для логистической регрессии. pкоторая является истинной / целевой пропорцией / вероятностью, pnoisyкоторая равна p с нормальным шумом, добавленным в шкалу логарифмических коэффициентов, и dichotкоторая является бесполезной обработкой в ​​качестве параметра для биномиального PDF и взята из него. Вы должны проверить все 3 - я обнаружил, что некоторые реализации LR с открытым исходным кодом не подходят p.

В зависимости от вашего приложения, вы можете предпочесть pnoisy.

На практике вы также должны подумать о том, как вероятно будет формироваться шум в целевом приложении, и попытаться имитировать это.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.