我在python中使用statsmodels的回归模型可以处理48,065行数据,但是在添加新数据时,我跟踪了一行代码,这些代码会产生奇异的矩阵错误。对类似问题的回答似乎暗示了数据丢失,但我已经检查过了,在容易出错的代码行中没有发现明显异常,这导致了我的重大问题。没有人知道这是我的代码中的错误还是因为我没有主意而知道解决此问题的解决方案。

Data2.csv-http://www.sharecsv.com/s/8ff31545056b8864f2ad26ef2fe38a09/Data2.csv

import pandas as pd
import statsmodels.formula.api as smf

data = pd.read_csv("Data2.csv")
formula = 'is_success ~ goal_angle + goal_distance + np_distance + fp_distance + is_fast_attack + is_header + prev_tb + is_rebound + is_penalty + prev_cross + is_tb2 + is_own_goal + is_cutback + asst_dist'
model = smf.mnlogit(formula, data=data, missing='drop').fit()


CSV行产生错误:0,0,0,0,0,0,0,1,22.94476,16.877204,13.484806,20.924627,0,0,11.765203

模型中的问题线错误:

runfile('C:/Users/User1/Desktop/Model Check.py', wdir='C:/Users/User1/Desktop')
Optimization terminated successfully.
         Current function value: 0.264334
         Iterations 20
Traceback (most recent call last):

  File "<ipython-input-76-eace3b458e24>", line 1, in <module>
    runfile('C:/Users/User1/Desktop/xG_xA Model Check.py', wdir='C:/Users/User1/Desktop')

  File "C:\Users\User1\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 714, in runfile
    execfile(filename, namespace)

  File "C:\Users\User1\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 74, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)

  File "C:/Users/User1/Desktop/xG_xA Model Check.py", line 6, in <module>
    model = smf.mnlogit(formula, data=data, missing='drop').fit()

  File "C:\Users\User1\Anaconda2\lib\site-packages\statsmodels\discrete\discrete_model.py", line 587, in fit
    disp=disp, callback=callback, **kwargs)

  File "C:\Users\User1\Anaconda2\lib\site-packages\statsmodels\base\model.py", line 434, in fit
    Hinv = np.linalg.inv(-retvals['Hessian']) / nobs

  File "C:\Users\User1\Anaconda2\lib\site-packages\numpy\linalg\linalg.py", line 526, in inv
    ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)

  File "C:\Users\User1\Anaconda2\lib\site-packages\numpy\linalg\linalg.py", line 90, in _raise_linalgerror_singular
    raise LinAlgError("Singular matrix")

LinAlgError: Singular matrix

最佳答案

据我所知:

问题在于变量is_own_goal,因为所有观察值为1的因变量is_success也等于1。这意味着结果没有变化,因为is_own_goal已经指定成功。

结果,我们无法估计is_own_goal的系数,该系数无法由数据识别。系数的方差将是无穷大的,并且由于Hessian是奇异的,因此将Hessian求取反以获取参数估计值的协方差失败。
给定浮点精度,加上一些计算噪声,粗麻布可能是可逆的,并且不会出现奇异矩阵异常。我猜这是它适用于部分而非全部观察结果的原因。

顺便说一句:如果因变量endg是二进制的,则Logit更合适,即使MNLogit有特殊情况也是如此。

顺便说一句:惩罚性估计是即使在少数情况下也可以强制进行估计的另一种方法,尽管该系数仍无法通过数据识别出来,而仅仅是惩罚性的结果。

在这个例子中

mod = smf.logit(formula, data=data, missing='drop').fit_regularized()

为我工作。这是L1处罚。在统计模型0.8中,对于GLM也存在弹性净罚款,该惩罚具有二项式(即Logit)作为一个族。

关于python - mnlogit回归,奇异矩阵误差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38932129/

10-12 18:51