Làm thế nào để mô phỏng dữ liệu nhân tạo cho hồi quy logistic?


45

Tôi biết tôi đang thiếu một cái gì đó trong sự hiểu biết của tôi về hồi quy logistic, và sẽ thực sự đánh giá cao bất kỳ sự giúp đỡ nào.

Theo như tôi hiểu, hồi quy logistic giả định rằng xác suất của kết quả '1' được đưa ra cho các đầu vào, là sự kết hợp tuyến tính của các đầu vào, được truyền qua hàm logistic nghịch đảo. Điều này được minh họa trong mã R sau:

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

và tôi nhận được thông báo lỗi sau:

Thông báo cảnh báo: 1: glm.fit: thuật toán không hội tụ 2: glm.fit: xác suất được trang bị bằng số 0 hoặc 1 xảy ra

Tôi đã làm việc với R một thời gian rồi; đủ để biết rằng có lẽ tôi là người đáng trách .. chuyện gì đang xảy ra ở đây vậy?


2
Cách bạn mô phỏng dữ liệu của bạn có vẻ kỳ lạ với tôi. Nếu bạn muốn, đối với một cách tiêu chuẩn khác, bạn có thể xem tại đây: stats.stackexchange.com/questions/12857/ chủ
ocram

@ocram: bạn nói đúng; đây là một câu hỏi trùng lặp
user603

2
Tôi đã chạy một mô phỏng sai lầm, như @ Stéphane Laurent giải thích. Tuy nhiên, vấn đề là sự tách biệt hoàn hảo trong hồi quy logistic , một vấn đề mà tôi không quen thuộc và tôi khá ngạc nhiên khi tìm hiểu về nó.
zorbar

@zorbar: đó là câu trả lời của tôi cho câu hỏi của bạn (hiện đã bị xóa).
user603

1
@ user603: Có lẽ tôi đã bỏ lỡ phản hồi của bạn; Dù sao cũng cảm ơn
zorbar

Câu trả lời:


63

Không. Biến trả lời là biến ngẫu nhiên Bernoulli lấy giá trị với xác suất . 1yi1pr(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 

Bạn nói đúng - Tôi đã bỏ lỡ bước này. cảm ơn sự giúp đỡ của bạn!
zorbar

1
Tôi đã có một câu hỏi liên quan đến cách bạn mô phỏng dữ liệu. Khi chúng tôi mô phỏng dữ liệu cho hồi quy tuyến tính, chúng tôi cũng mô phỏng tiếng ồn (\ epsilon). Tôi hiểu rằng chức năng logistic là một chức năng của sự kỳ vọng mà chính nó sẽ loại bỏ tiếng ồn. Đó có phải là lý do mà bạn không có bất kỳ tiếng ồn nào trong z không?
Sam

5
@Sepehr Hồi quy tuyến tính giả định phân phối Gaussian. "Nhiễu" chỉ là một cách giải thích về tính biến thiên xung quanh giá trị trung bình, nhưng đây không phải là tiếng ồn được thêm vào phản hồi: phản hồi được viết dưới dạng , đây chỉ là một cách giải thích. Hồi quy logistic giả định rằng phản hồi có phân phối nhị thức và tương tự không có nhiễu được thêm vào phản hồi. mean response+noise
Stéphane Laurent

@ StéphaneLaurent, chính xác. Tôi hoàn toàn nhận được. Cảm ơn rất nhiều cho câu trả lời của bạn.
Sam

2

LogisticRegression phù hợp để phù hợp nếu xác suất hoặc tỷ lệ được cung cấp làm mục tiêu, không chỉ là kết quả 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='.')

Ở đây chúng tôi có ba mục tiêu tiềm năng cho hồi quy logistic. pđó là tỷ lệ / xác suất đích / xác thực, pnoisylà p với tiếng ồn bình thường được thêm vào trong tỷ lệ cược log và dichot, được coi là một tham số cho tệp nhị thức PDF và được lấy mẫu từ đó. Bạn nên kiểm tra cả 3 - Tôi thấy một số triển khai LR nguồn mở không thể phù hợp p.

Tùy thuộc vào ứng dụng của bạn, bạn có thể thích pnoisy.

Trong thực tế, bạn cũng nên xem xét mức độ nhiễu thể được định hình trong ứng dụng mục tiêu của bạn và cố gắng mô phỏng điều đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.