【问题标题】:Stats Models Logit().fit() function throwing an error LinAlgError: Singular matrixStats Models Logit().fit() 函数抛出错误 LinAlgError: 奇异矩阵
【发布时间】:2018-07-14 02:48:30
【问题描述】:

我正在尝试在 mpg_high 是基于其他数据框列的结果变量的数据集上创建运行 logit 模型。

当我运行以下代码时,我没有收到任何错误:

exog = ['constant','cylinders','displacement','horsepower','weight','year', 'origin']

logit = sm.Logit(endog = df_quant2['mpg_high'], exog = df_quant2[['constant','cylinders','displacement','horsepower','weight','year', 'origin']])

但是当我尝试使用时

logit.fit()

我收到以下错误:

Warning: Maximum number of iterations has been exceeded.
         Current function value: inf
         Iterations: 35


/Users/*/anaconda/lib/python3.6/site-packages/statsmodels/discrete/discrete_model.py:1214: RuntimeWarning: overflow encountered in exp
  return 1/(1+np.exp(-X))
/Users/*/anaconda/lib/python3.6/site-packages/statsmodels/discrete/discrete_model.py:1264: RuntimeWarning: divide by zero encountered in log
  return np.sum(np.log(self.cdf(q*np.dot(X,params))))
---------------------------------------------------------------------------
LinAlgError                               Traceback (most recent call last)
<ipython-input-112-f8dd482d7884> in <module>()
----> 1 logit.fit()

/Users/*/anaconda/lib/python3.6/site-packages/statsmodels/discrete/discrete_model.py in fit(self, start_params, method, maxiter, full_output, disp, callback, **kwargs)
   1375         bnryfit = super(Logit, self).fit(start_params=start_params,
   1376                 method=method, maxiter=maxiter, full_output=full_output,
-> 1377                 disp=disp, callback=callback, **kwargs)
   1378 
   1379         discretefit = LogitResults(self, bnryfit)

/Users/*/anaconda/lib/python3.6/site-packages/statsmodels/discrete/discrete_model.py in fit(self, start_params, method, maxiter, full_output, disp, callback, **kwargs)
    202         mlefit = super(DiscreteModel, self).fit(start_params=start_params,
    203                 method=method, maxiter=maxiter, full_output=full_output,
--> 204                 disp=disp, callback=callback, **kwargs)
    205 
    206         return mlefit # up to subclasses to wrap results

/Users/*/anaconda/lib/python3.6/site-packages/statsmodels/base/model.py in fit(self, start_params, method, maxiter, full_output, disp, fargs, callback, retall, skip_hessian, **kwargs)
    456             Hinv = cov_params_func(self, xopt, retvals)
    457         elif method == 'newton' and full_output:
--> 458             Hinv = np.linalg.inv(-retvals['Hessian']) / nobs
    459         elif not skip_hessian:
    460             H = -1 * self.hessian(xopt)

/Users/*/anaconda/lib/python3.6/site-packages/numpy/linalg/linalg.py in inv(a)
    511     signature = 'D->D' if isComplexType(t) else 'd->d'
    512     extobj = get_linalg_error_extobj(_raise_linalgerror_singular)
--> 513     ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)
    514     return wrap(ainv.astype(result_t, copy=False))
    515 

/Users/*/anaconda/lib/python3.6/site-packages/numpy/linalg/linalg.py in _raise_linalgerror_singular(err, flag)
     88 
     89 def _raise_linalgerror_singular(err, flag):
---> 90     raise LinAlgError("Singular matrix")
     91 
     92 def _raise_linalgerror_nonposdef(err, flag):

LinAlgError: Singular matrix

mpg_high 值中的所有值都是 0 或 1

不确定我在这里缺少什么,感谢任何帮助!

谢谢!

【问题讨论】:

  • 根据警告,我会尝试增加 maxiter 并查看它是否在这种情况下收敛。另一个要检查的问题是您是否没有遇到虚拟变量陷阱并创建了一个奇异的设计矩阵exog。具有非线性优化的模型无法处理奇异设计矩阵或奇异 hessian。

标签: python python-3.x statistics statsmodels


【解决方案1】:

更新

通过从 endog 参数中排除马力变量,我能够使某些模型工作。这可能是由于数据类型。我已经将其转换为 float64,但模型仍然无法使用现在更改的列数据类型运行

【讨论】:

  • 我认为如果您打印出整个数据框(我猜它不是太大)并准确说明您现在遇到的错误是什么,这将有所帮助。
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2021-01-30
  • 2017-11-02
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多