如何模拟人工数据进行逻辑回归?


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 2012年

2
正如@StéphaneLaurent所解释的,我确实进行了错误的模拟。但是,问题是逻辑回归中的完美分离,这是我不熟悉的问题,对此我感到非常惊讶。
zorbar

@zorbar:是我对您的问题的答复(现已删除)。
user603 2012年

1
@ user603:我可能错过了您的回复;无论如何
zorbar

Answers:


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 2012年

1
我对您模拟数据的方式有疑问。当我们为线性回归模拟数据时,我们还模拟了噪声(\ epsilon)。我了解逻辑功能是期望的功能,它本身可以消除噪音。这是因为z中没有任何噪声的原因吗?
山姆

5
@Sepehr线性回归假设高斯分布。“噪声”只是对均值周围变异性的一种解释,但这并不是添加到响应中的噪声:响应写为,这仅仅是一种解释。逻辑回归假设响应具有二项式分布,并且类似地,没有噪声添加到响应中。mean response+noise
斯蒂芬·洛朗

@StéphaneLaurent,确实如此。我完全明白了。非常感谢您的回答。
2014年

2

如果提供概率或比例作为目标,而不仅仅是0/1结果,则LogisticRegression适合拟合。

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

根据您的应用程序,您可能更喜欢烦躁。

在实践中,您还应该考虑目标应用程序中可能如何形成噪声并尝试对其进行仿真。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.