陷阱¶
此页面列出了使用 statsmodels 时可能出现的错误。这些错误可能是由于数据相关或统计问题、软件设计、“非标准”模型使用或极端情况造成的。
statsmodels 提供了一些警告和辅助函数来进行诊断检查(请查看此 博客文章 了解线性回归中模型错误指定检查的示例)。当然,覆盖范围并不全面,但随着时间的推移,将增加更多警告和诊断功能。
虽然所有统计软件包的底层统计问题都相同,但软件实现方式在处理极端情况或极端情况方面有所不同。请报告可能导致模型无法正常工作的极端情况,以便我们能够适当地处理它们。
对 fit 的重复调用,使用不同的参数¶
Result 实例通常需要访问相应模型实例的属性。使用不同的参数多次拟合模型可能会更改模型属性。这意味着,在模型重新拟合后,Result 实例可能不再指向正确的模型属性。
因此,最佳实践是在我们希望使用不同的拟合函数参数拟合模型时创建单独的模型实例。
例如,这在没有问题的情况下工作,因为我们没有保留 Result 实例以供进一步使用
mod = AR(endog)
aic = []
for lag in range(1,11):
res = mod.fit(maxlag=lag)
aic.append(res.aic)
但是,当我们想保留两种不同的估计结果时,建议创建两个独立的模型实例。
mod1 = RLM(endog, exog)
res1 = mod1.fit(scale_est='mad')
mod2 = RLM(endog, exog)
res2 = mod2.fit(scale_est=sm.robust.scale.HuberScale())
未识别的参数¶
秩亏的 exog,完全共线性¶
基于线性模型的模型,例如 GLS、RLM、GLM 等,使用广义逆。这意味着
秩亏矩阵不会引发错误
几乎完全共线性或病态设计矩阵可能会产生数值不稳定的结果。如果这不是期望的行为,用户需要手动检查矩阵的秩或条件数
注意:statsmodels 目前在数据未重新缩放的情况下,在 Filip 的 NIST 基准测试用例上失败,请查看 此博客
最大似然估计中的不完全收敛¶
在某些情况下,最大似然估计可能不存在,参数可能为无穷大或不唯一(例如,具有二元内生变量的模型中的(准)分离)。在默认设置下,如果优化算法停止而没有达到收敛,则 statsmodels 将打印警告。但是,重要的是要知道收敛条件有时可能会错误地表明收敛(例如,如果目标函数的值收敛但参数没有收敛)。通常,用户需要验证收敛。
对于二元 Logit 和 Probit 模型,如果检测到完美预测,statsmodels 将引发异常。但是,没有检查准完美预测。
其他问题¶
数据中的变异不足¶
对于小型数据集或在分类变量中具有小型组的数据,数据中可能存在不足的变异。在这些情况下,结果可能无法识别,或者可能出现一些隐藏问题。
目前已知唯一的情况是在稳健线性模型估计中完美拟合。对于 RLM,如果残差等于零,则不会导致异常,但具有这种完美拟合可能会在某些结果中产生 NaN(scale=0 和 0/0 除法)(问题 #55)。
真实参数超出模型域¶
在某些情况下,模型中参数的域限制可能与数据不一致。在这些情况下,估计可能会在接近参数空间边界的值处停止,但也可能因运行时错误而失败或在优化过程中产生 NaN。
两个示例
当数据相对于泊松分布不过度分散时,估计负二项式模型,也就是说,真实模型与泊松分布具有相同的离散程度或不足分散,与负二项式分布的过度分散假设不一致。在 statsmodels 中实现的对数似然及其导数,无法评估分散参数在零分散或零分散的正邻域。
零膨胀模型目前使用 Logit 或 Probit 作为膨胀模型。这意味着,没有膨胀处于参数空间的边界,而零缩减位于有效的参数空间之外。当数据没有零膨胀或为零缩减时,零膨胀模型通常会在优化中失败,或者最终接近无膨胀边界。