57 votos

¿Cómo simular datos artificiales para la regresión logística?

Sé que me falta algo en mi comprensión de la regresión logística, y agradecería mucho cualquier ayuda.

Por lo que tengo entendido, la regresión logística supone que la probabilidad de un resultado "1" dados los datos de entrada, es una combinación lineal de los datos de entrada, pasada por una función logística inversa. Esto se ejemplifica en el siguiente código 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")

y recibo el siguiente mensaje de error:

Mensajes de advertencia: 1: glm.fit: el algoritmo no converge 2: glm.fit: las probabilidades ajustadas son numéricamente 0 o 1

He trabajado con R durante algún tiempo; lo suficiente como para saber que probablemente yo sea el culpable.. ¿qué está pasando aquí?

83voto

Ηλίας Puntos 109

No. La variable de respuesta $y_i$ es una variable aleatoria Bernoulli que toma el valor $1$ con probabilidad $pr(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

5voto

Adithya Holla Puntos 13

LogisticRegression es adecuado para el ajuste si se proporcionan probabilidades o proporciones como objetivos, no sólo resultados 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='.')

Aquí tenemos tres objetivos potenciales para la regresión logística. p que es la proporción/probabilidad verdadera/objetiva, pnoisy que es p con ruido normal añadido en la escala de probabilidades logarítmicas, y dichot , que se trata como un parámetro de la PDF binomial, y se muestrea a partir de ella. Usted debe probar los 3 - He encontrado algunas implementaciones de código abierto LR no puede encajar p .

Dependiendo de su aplicación, puede preferir pnoisy.

En la práctica, también hay que tener en cuenta cómo es el ruido probablemente en su aplicación de destino y tratar de emularlo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X