由于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?
答案 0 :(得分:0)
一般来说,当分布的支持取决于参数时,存在最大似然估计的理论和计算问题。
在这种情况下,n定义了分布的上限,并且据我记得,在这种情况下,标准错误等推理统计信息无效。
在通常的二项式案例中,我们假设试验数n是已知的,我们只估计概率或比例。在statsmodels和其他包中,可以通过将GLM与族二项式一起使用并将成功和失败的次数指定为因变量来估计。 默认情况下,使用Logit链接,该链接要求转换参数以获得在这种情况下由预测方法完成的概率。