Як моделювати штучні дані для логістичної регресії?


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

@ocram: ти маєш рацію; це повторне запитання!
user603

2
Я зробив помилкове моделювання, як пояснив @ Stéphane Laurent. Однак проблема полягала в ідеальному розділенні логістичної регресії , проблемі, з якою я не був знайомий, і про що я досить здивований.
zorbar

@zorbar: це було у моїй відповіді на ваше запитання (зараз видалено).
user603

1
@ user603: я, мабуть, пропустив вашу відповідь; Все одно
дякую

Відповіді:


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, яка pnoisy трактується як параметр до двочленного PDF, і відбирається з цього. Ви повинні протестувати всі 3 - я виявив, що деякі реалізації LR з відкритим кодом не можуть вміститися p.

Залежно від вашої заявки, ви можете віддати перевагу пнусі.

На практиці, ви повинні також розглянути питання про те , як шум , швидше за все , щоб мати форму ви налагоджувати і намагаєтеся наслідувати цим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.