mnlogit回归,奇异矩阵误差
mnlogit regression, singular matrix error
我在 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 是奇异的。
在给定浮点精度的情况下,由于存在一些计算噪声,hessian 矩阵可能是可逆的,奇异矩阵异常也不会出现。我想,这就是它适用于一些但不是所有观察结果的原因。
顺便说一句:如果因变量 endog 是二元的,那么 Logit 更合适,即使 MNLogit 将其作为特例。
顺便说一句:即使在单一情况下,惩罚估计也是强制估计的另一种方法,尽管系数仍然不会被数据识别,而只是惩罚的结果。
在这个例子中,
mod = smf.logit(formula, data=data, missing='drop').fit_regularized()
适合我。这是 L1 惩罚。在 statsmodels 0.8 中,对于具有二项式(即 Logit)作为一个家族的 GLM 也有弹性净惩罚。
我在 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 是奇异的。 在给定浮点精度的情况下,由于存在一些计算噪声,hessian 矩阵可能是可逆的,奇异矩阵异常也不会出现。我想,这就是它适用于一些但不是所有观察结果的原因。
顺便说一句:如果因变量 endog 是二元的,那么 Logit 更合适,即使 MNLogit 将其作为特例。
顺便说一句:即使在单一情况下,惩罚估计也是强制估计的另一种方法,尽管系数仍然不会被数据识别,而只是惩罚的结果。
在这个例子中,
mod = smf.logit(formula, data=data, missing='drop').fit_regularized()
适合我。这是 L1 惩罚。在 statsmodels 0.8 中,对于具有二项式(即 Logit)作为一个家族的 GLM 也有弹性净惩罚。