GenericLikelihoodModel适合二项分布:输出stderr是nan

时间:2017-07-25 17:33:09

标签: python statsmodels mle

由于python中没有直接的离散分布拟合包,我尝试使用statsmodels.base.model.GenericLikelihoodModel来拟合二项分布。然而,在某些情况下,例如,n = 5,p = 0.5,除了点估计之外,估计摘要中的每个项都是纳米。

如果我将n从5改为10,那么一切都很好。

我的代码是:

import numpy as np
from statsmodels.base.model import GenericLikelihoodModel
from scipy.stats import binom


class Binom(GenericLikelihoodModel):
    def loglike(self, params):            
        return np.log(binom.pmf(self.endog, *params)).sum()

n, p = 5, 0.5
params = (n, p)
x = binom.rvs(5, p, size=1000, random_state=1)

res = Binom(x).fit(start_params=params)
res.df_model = len(params)
res.df_resid = len(x) - len(params)
print(res.summary())

相关输出:

        coef    std err          z      P>|z|      [95.0% Conf. Int.]
par0  5.0000        nan        nan        nan       nan       nan
par1  0.4972        nan        nan        nan       nan       nan

错误讯息:

// anaconda / lib / python3.6 / site-packages / ipykernel / main .py:23:RuntimeWarning:在日志中遇到零除

// anaconda / lib / python3.6 / site-packages / statsmodels / tools / numdiff.py:329:运行时警告:double_scalars中遇到无效值    - f(*((x - ee [i,:] - ee [j,:],)+ args),** kwargs),)

// anaconda / lib / python3.6 / site-packages / scipy / stats / _distn_infrastructure.py:875:RuntimeWarning:遇到无效值   返回(self.a< x)& (x< self.b)

// anaconda / lib / python3.6 / site-packages / scipy / stats / _distn_infrastructure.py:875:RuntimeWarning:遇到无效值   返回(self.a< x)& (x< self.b)

// anaconda / lib / python3.6 / site-packages / scipy / stats / _distn_infrastructure.py:1814:RuntimeWarning:less_equal中遇到无效值   cond2 = cond0& (x< = self.a)

我终于找到了我的代码失败的原因。在statsmodels中,std err的计算是通过公式

np.sqrt(np.diag(self.cov_params()))

其中cov_params是点估计的粗糙矩阵。在拟合过程中,通过

计算粗糙矩阵
hess[i, j] = (f(*((x + ee[i, :] + ee[j, :],) + args), **kwargs)
                      - f(*((x + ee[i, :] - ee[j, :],) + args), **kwargs)
                      - (f(*((x - ee[i, :] + ee[j, :],) + args), **kwargs)
                      - f(*((x - ee[i, :] - ee[j, :],) + args), **kwargs),)
                      )/(4.*hess[i, j])

其中f是对数函数,x是点估计,ee是估计误差。如果n的点估计是实数n,则需要针对hess [i,j]计算f(n-ee,p)。 n-ee< Ñ

结合我自定义的loglike函数,我们可以看到它涉及log(0)= Inf(下面解释)的计算,而hess [i,j]涉及添加log(0)(导致nan)。这就是为什么最终的标准错误和所有其他指标变成了纳米。

log(0)中的零是通过binom.pmf(x,n,p)= 0获得的,其中x> n。在我的实践中,样本大小是1000.鉴于binom.pmf(5,5,0.5)= 0.03125和binom.pmf(10,10,0.5)= 0.00097,我们可以看到当我选择n = 10,p = 0.5对于取样,样品中可能不存在10个。因此我们不会遇到log(0)情况。但是,如果我将样本大小增加到1000000,则会出现样本错误,如预期的那样。

所以我的问题现在变成了一种方法,通过修改我的自定义日志函数或通过覆盖statsmodels中的hessian函数,来计算这种情况下的std err?

1 个答案:

答案 0 :(得分:0)

一般来说,当分布的支持取决于参数时,存在最大似然估计的理论和计算问题。

在这种情况下,n定义了分布的上限,并且据我记得,在这种情况下,标准错误等推理统计信息无效。

在通常的二项式案例中,我们假设试验数n是已知的,我们只估计概率或比例。在statsmodels和其他包中,可以通过将GLM与族二项式一起使用并将成功和失败的次数指定为因变量来估计。 默认情况下,使用Logit链接,该链接要求转换参数以获得在这种情况下由预测方法完成的概率。