로지스틱 회귀 분석을 위해 인공 데이터를 시뮬레이션하는 방법은 무엇입니까?


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 : 아마 당신의 응답을 놓쳤다; 어쨌든 감사합니다
zorbar

답변:


63

와이나는1아르 자형(나는)

> 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에 노이즈가없는 이유입니까?
Sam

5
평균 반응+소음

@ StéphaneLaurent, 정확히. 나는 완전히 얻는다. 답변 주셔서 대단히 감사합니다.
Sam

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를 선호 할 수 있습니다.

실제로, 당신은 또한 소음이 얼마나 고려해야 할 가능성 이 응용 프로그램을 대상으로하고을 모방하려고 모양되어야한다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.