Python Statsmodels抛出;exp中的溢出";及;在对数中除以零;警告和伪R平方为-inf

Python Statsmodels抛出;exp中的溢出";及;在对数中除以零;警告和伪R平方为-inf,python,statistics,logistic-regression,statsmodels,Python,Statistics,Logistic Regression,Statsmodels,我想使用Statsmodels在Python中进行逻辑回归 X和y各有750行,y是二进制结果,X是10个特征(包括intecept) 以下是X的前12行(最后一列是截距): 这是我的代码: import statsmodels.api as sm logit = sm.Logit(y, X, missing='drop') result = logit.fit() print(result.summary()) 这是输出: /home/ipattern/anaconda3/lib/pyth

我想使用Statsmodels在Python中进行逻辑回归

X和y各有750行,y是二进制结果,X是10个特征(包括intecept)

以下是X的前12行(最后一列是截距):

这是我的代码:

import statsmodels.api as sm

logit = sm.Logit(y, X, missing='drop')
result = logit.fit()
print(result.summary())
这是输出:

/home/ipattern/anaconda3/lib/python3.6/site packages/statsmodels/discrete/discrete_model.py:1214: 运行时警告:exp中遇到溢出
返回1/(1+np.exp(-X))

/home/ipattern/anaconda3/lib/python3.6/site packages/statsmodels/discrete/discrete_model.py:1264: 运行时警告:在日志中遇到被零除的情况
返回 np.sum(np.log(self.cdf(q*np.dot(X,params)))

底部的系数、标准误差、p值等是正确的(我知道这一点,因为我有“解决方案”)

但正如您所看到的,
当前函数值是inf
,我认为这是错误的

我收到两个警告。显然,statsmodels在某个地方没有np.exp(BIGNUMBER),例如np.exp(999)和np.log(0)

同样
伪R-squ。is-inf
对数似然is-inf
,我认为这不应该是
-inf

那么我做错了什么

编辑:

X.描述():

logit.loglikeobs(result.params):

(logit.exog*np.array(result.params)).min(0):

数据集:

X:


y:

我很惊讶它在这种情况下仍然收敛

当x值较大时,使用Logit或Poisson中使用的exp函数溢出可能会出现收敛问题。这通常可以通过重新调整回归器的尺度来避免

然而,在这种情况下,我的猜测是x中的异常值。第6列的值类似于4134.0,而其他列则小得多

您可以检查每个观测值的对数似然性
logit.loglikeobs(result.params)
以查看哪些观测值可能导致问题,其中
logit
是引用模型的名称

例如,每个预测因子的贡献也可能有所帮助

np.argmax(np.abs(logit.exog*result.params),0)

(logit.exog*result.params).min(0)

如果只是一个或几个观察结果,那么删除它们可能会有所帮助。重新缩放exog很可能对此没有帮助,因为在收敛时,它将通过重新缩放估计系数来补偿

还要检查是否存在编码错误或较大的值作为缺少值的占位符

编辑

鉴于loglikeobs中
-inf
的数量似乎很大,我认为可能存在比离群值更根本的问题,因为Logit模型不是该数据集正确指定的最大似然模型

通常有两种可能性(因为我没有看到数据集):

完美分离:Logit假设预测概率远离0和1。在某些情况下,解释变量或它们的组合可以完美地预测因变量。在这种情况下,参数要么未识别,要么变为正负无穷大。实际参数估计取决于优化的收敛准则。Statsmodels Logit为此检测到一些情况,然后引发并完善分离异常,但它不会检测到部分分离的所有情况

Logit或GLM二项式属于单参数线性指数族。这种情况下的参数估计仅取决于指定的平均函数和隐含方差。它不要求正确指定似然函数。因此,即使对于给定的数据集,似然函数不正确,也有可能得到良好的(一致的)估计。在这种情况下,解是一个拟极大似然估计量,但对数似然值无效

这可能导致收敛性和数值稳定性方面的结果取决于如何处理边缘或极端情况的计算细节。在某些情况下,Statsmodels会剪裁这些值以使它们远离边界,但并非所有情况下都是如此

困难在于,当底层模型不适合或与数据不兼容时,如何解决数值问题,避免在不通知用户的情况下返回“某些”数字


在这种情况下,
llf=-inf
可能是“正确”的答案,任何有限数都只是-inf的近似值。可能这只是一个数值问题,因为函数是以双精度实现的。

谢谢您的帮助!我编辑了我的帖子并添加了你说的内容。在使用glm()函数的R中,一切看起来都正常。例如,没有警告等,伪R平方不是-inf。您也可以尝试statmodels GLM二项式,它与二进制endog的Logit模型相同,但使用不同的数值方法。在非边缘和非极端情况下,两个模型产生相同的结果。GLM也有偏差(但可能会遇到相同的溢出问题)。我试过statsmodels GLM二项式,效果很好!正如你所说,很难找到statsmodels的Logit函数有什么问题,所以我想我们使用GLM二项函数。另外,正确答案是什么?@Phillip如果数据集是公开的,那么您可以将案例发布到statsmodels问题跟踪程序。我猜Logit需要保持预测概率远离0和1,这是目前尚未完成的。然而,我怀疑在这样的极端情况下,对数似然
llf
将由选择作为剪裁阈值的任何对象控制
import statsmodels.api as sm

logit = sm.Logit(y, X, missing='drop')
result = logit.fit()
print(result.summary())
     Optimization terminated successfully.

     Current function value: inf

     Iterations 9
                           Logit Regression Results                           
==============================================================================
Dep. Variable:                  warsa   No. Observations:                  750
Model:                          Logit   Df Residuals:                      740
Method:                           MLE   Df Model:                            9
Date:                Tue, 12 Sep 2017   Pseudo R-squ.:                    -inf
Time:                        11:16:58   Log-Likelihood:                   -inf
converged:                       True   LL-Null:                   -4.6237e+05
                                        LLR p-value:                     1.000
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
lngdp_        -0.9504      0.245     -3.872      0.000      -1.431      -0.469
lnpop          0.5105      0.128      3.975      0.000       0.259       0.762
sxp           16.7734      5.206      3.222      0.001       6.569      26.978
sxp2         -23.8004     10.040     -2.371      0.018     -43.478      -4.123
gy1           -0.0980      0.041     -2.362      0.018      -0.179      -0.017
frac          -0.0002    9.2e-05     -2.695      0.007      -0.000   -6.76e-05
etdo4590       0.4801      0.328      1.463      0.144      -0.163       1.124
geogia        -0.9919      0.909     -1.091      0.275      -2.774       0.790
peace         -0.0038      0.001     -3.808      0.000      -0.006      -0.002
intercept     -3.4375      2.486     -1.383      0.167      -8.310       1.435
==============================================================================
           lngdp_       lnpop         sxp        sxp2         gy1  \
count  750.000000  750.000000  750.000000  750.000000  750.000000   
mean     7.766948   15.702191    0.155329    0.043837    1.529772   
std      1.045121    1.645154    0.140486    0.082838    3.546621   
min      5.402678   11.900227    0.002000    0.000004  -13.088000   
25%      6.882694   14.723123    0.056000    0.003136   -0.411250   
50%      7.696212   15.680984    0.111000    0.012321    1.801000   
75%      8.669355   16.652981    0.203000    0.041209    3.625750   
max      9.851826   20.908354    0.935000    0.874225   14.409000   

              frac    etdo4590      geogia       peace  intercept  
count   750.000000  750.000000  750.000000  750.000000      750.0  
mean   1812.777333    0.437333    0.600263  348.209333        1.0  
std    1982.106029    0.496388    0.209362  160.941996        0.0  
min      12.000000    0.000000    0.000000    1.000000        1.0  
25%     176.000000    0.000000    0.489250  232.000000        1.0  
50%     864.000000    0.000000    0.608000  352.000000        1.0  
75%    3375.000000    1.000000    0.763000  472.000000        1.0  
max    6975.000000    1.000000    0.971000  592.000000        1.0 
array([ -4.61803704e+01,  -2.26983454e+02,  -2.66741244e+02,
        -2.60206733e+02,  -4.75585266e+02,  -1.76454554e+00,
        -4.86048292e-01,  -8.02300533e-01,             -inf,
                   -inf,             -inf,             -inf,
                   -inf,             -inf,             -inf,
                   -inf,             -inf,             -inf,
                   -inf,             -inf,             -inf,
                   -inf,             -inf,             -inf,
                   -inf,             -inf,             -inf,
                   -inf,             -inf,             -inf,
                   -inf,             -inf,  -6.02780923e+02,
        -4.12209348e+02,  -6.42901288e+02,  -6.94331125e+02,
                   -inf,             -inf,             -inf,
                   -inf,             -inf,             -inf,
                   -inf,             -inf,             -inf, ...
array([ -9.36347474,   6.07506083,   0.03354677, -20.80694575,
        -1.41162588,  -1.72895247,   0.        ,  -0.9631801 ,
        -2.23188846,  -3.4374963 ])