陷阱¶
本页面列出了在使用 statsmodels 时可能出现的问题。这些问题可能是由数据相关或统计问题、软件设计、“非标准”使用模型或边缘情况引起的。
statsmodels 提供了几个用于诊断检查的警告和辅助函数(参见这篇博客文章,了解线性回归中误差规范检查的示例)。当然,覆盖范围并不全面,但更多的警告和诊断功能将随着时间的推移而添加。
尽管底层统计问题对于所有统计软件包都是相同的,但软件实现方式在处理极端或边界情况时有所不同。请报告模型可能无法处理的边界情况,以便我们能够适当地处理它们。
使用不同参数重复调用fit¶
结果实例通常需要访问相应模型实例的属性。使用不同的参数多次拟合模型可能会改变模型属性。这意味着在模型重新拟合后,结果实例可能不再指向正确的模型属性。
因此,当我们想要使用不同的拟合函数参数来拟合模型时,最好创建单独的模型实例。
例如,这不会出现问题,因为我们没有保留结果实例以供进一步使用
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 目前在 NIST 基准案例 Filip 上会失败,请参阅 这篇博客
最大似然估计中的不完全收敛¶
在某些情况下,最大似然估计量可能不存在,参数可能是无限的或不唯一的(例如,在具有二元内生变量的模型中出现(准)分离)。在默认设置下,statsmodels 会在优化算法停止而未达到收敛时打印警告。然而,重要的是要知道收敛标准有时可能会错误地指示收敛(例如,如果目标函数的值收敛但参数未收敛)。通常,用户需要验证收敛性。
对于二元Logit和Probit模型,如果检测到完全预测,statsmodels会引发异常。然而,对于准完全预测,并没有进行检查。
其他问题¶
数据中的变化不足¶
对于小数据集或分类变量中组别较小的数据,可能存在数据变异不足的情况。在这些情况下,结果可能无法识别或可能出现一些隐藏的问题。
目前唯一已知的情况是在稳健线性模型估计中的完全拟合。 对于RLM,如果残差等于零,则不会引发异常, 但这种完全拟合可能会在某些结果中产生NaNs(比例=0和0/0除法)(问题#55)。
真实参数超出模型的定义域¶
在某些情况下,模型中参数的域限制可能与数据不一致。在这些情况下,估计可能会在接近参数空间边界时停止,但也可能会因运行时错误或在优化过程中产生NaN而失败。
两个例子:
当数据相对于泊松分布没有过度分散时,即真实模型的分散性与泊松分布相同或分散不足时,估计负二项模型与负二项分布的过度分散假设不一致。在 statsmodels 中实现的似然函数及其导数无法在分散参数为零分散或零分散的正邻域内进行评估。
零膨胀模型目前使用Logit或Probit作为膨胀模型。这意味着没有膨胀是在参数空间的边界上,而零通货紧缩是在有效的参数空间之外。当数据没有零膨胀或零通货紧缩时,零膨胀模型通常会在优化中失败,或者最终接近无膨胀边界。