ロジスティック回帰の人工データをシミュレートする方法は?


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éphaneLaurentが説明したように、間違ったシミュレーションを実行しました。しかし、問題はロジスティック回帰の完全な分離であり、私がよく知らなかった問題であり、学ぶのにかなり驚きました。
zorbar

@zorbar:それはあなたの質問に対する私の応答にありました(現在削除されています)。
user603

1
@ user603:おそらくあなたの応答を逃しました。とにかく感謝
zorbar

回答:


63

いいえ。応答変数は、確率値をとるベルヌーイ確率変数です。 1 p r i 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にノイズがない理由ですか?
サム14年

5
@Sepehr線形回帰は、ガウス分布を想定しています。「ノイズ」は平均の変動の解釈に過ぎませんが、これは応答に追加されるノイズではありません。応答はとして記述され、これは単なる解釈です。ロジスティック回帰では、応答に二項分布があり、同様に応答にノイズが追加されていないことを想定しています。mean response+noise
ステファンローラン14年

@StéphaneLaurent、正確に。私は完全に得ます。ご回答ありがとうございます。
サム14年

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

ここには、ロジスティック回帰の3つの潜在的なターゲットがあります。pこれは、真/目標の割合/確率です。pnoisyこれは、対数オッズスケールで追加された通常のノイズを伴うp dichotです。3つすべてをテストする必要がありpます。一部のオープンソースLR実装は適合しません。

アプリケーションによっては、うるさいこともあります。

実際には、ターゲットアプリケーションでノイズがどのように形成される可能性があるかを考慮し、それをエミュレートしてみてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.