Python 如何在scipy.stats.gamma.fit中获得拟合参数的误差估计?
我用scipy.stats拟合了一些gamma分布。我能够提取形状、位置和比例参数,它们看起来与我期望的数据范围合理 我的问题是:有没有一种方法可以同时获得参数中的错误?类似于曲线拟合的输出。注意:我不直接使用曲线拟合,因为它工作不正常,而且大部分时间无法计算伽马分布的参数。另一方面,scipy.stats.gamma.fit工作正常 这是我正在做的一个例子(没有我的实际数据)Python 如何在scipy.stats.gamma.fit中获得拟合参数的误差估计?,python,numpy,scipy,curve-fitting,data-fitting,Python,Numpy,Scipy,Curve Fitting,Data Fitting,我用scipy.stats拟合了一些gamma分布。我能够提取形状、位置和比例参数,它们看起来与我期望的数据范围合理 我的问题是:有没有一种方法可以同时获得参数中的错误?类似于曲线拟合的输出。注意:我不直接使用曲线拟合,因为它工作不正常,而且大部分时间无法计算伽马分布的参数。另一方面,scipy.stats.gamma.fit工作正常 这是我正在做的一个例子(没有我的实际数据) from scipy.stats import gamma shape = 12; loc = 0.71; scale
from scipy.stats import gamma
shape = 12; loc = 0.71; scale = 0.0166
data = gamma.rvs(shape, loc=loc, scale=scale, size=1000)
params = gamma.fit(data) # params close to but not the same as (shape, loc, scale)
# HOW TO ESTIMATE/GET ERRORS FOR EACH PARAM?
提前感谢编辑
警告:下面按照问题中的示例说明了genericlikelikelihoodmodel
的用法。
然而,在伽马分布的情况下,位置参数改变了分布的支持度,这被最大似然估计的一般假设所排除。更标准的用法将修复支持,floc=0,因此它只是一个双参数分布。在这种情况下,标准的MLE理论适用
Statsmodels有一个用于最大似然估计的通用类,GenericLikelihoodModel
。它不是直接针对这种情况设计的,但是可以在一些帮助下使用(定义属性并提供开始参数)
这将打印以下内容
(10.31888758604304, 0.71645502437403186, 0.018447479022445423)
Optimization terminated successfully.
Current function value: -1.439996
Iterations: 69
Function evaluations: 119
Gamma Results
==============================================================================
Dep. Variable: y Log-Likelihood: 1440.0
Model: Gamma AIC: -2872.
Method: Maximum Likelihood BIC: -2852.
Date: Sun, 12 Jul 2015
Time: 04:00:05
No. Observations: 1000
Df Residuals: 997
Df Model: 3
==============================================================================
coef std err z P>|z| [95.0% Conf. Int.]
------------------------------------------------------------------------------
par0 10.3187 2.242 4.603 0.000 5.925 14.712
par1 0.7165 0.019 37.957 0.000 0.679 0.753
par2 0.0184 0.002 8.183 0.000 0.014 0.023
==============================================================================
基于最大似然估计的其他结果也可用,例如,第一个参数为10的z-检验可以通过指定限制矩阵或使用具有以下等式的字符串表达式来执行:
>>> res.t_test(([1, 0, 0], [10]))
<class 'statsmodels.stats.contrast.ContrastResults'>
Test for Constraints
==============================================================================
coef std err z P>|z| [95.0% Conf. Int.]
------------------------------------------------------------------------------
c0 10.3187 2.242 0.142 0.887 5.925 14.712
==============================================================================
>>> res.t_test('par0=10')
<class 'statsmodels.stats.contrast.ContrastResults'>
Test for Constraints
==============================================================================
coef std err z P>|z| [95.0% Conf. Int.]
------------------------------------------------------------------------------
c0 10.3187 2.242 0.142 0.887 5.925 14.712
==============================================================================
>res.t_测试([1,0,0],[10]))
约束测试
==============================================================================
coef标准错误z P>|z |[95.0%配置内部]
------------------------------------------------------------------------------
c0 10.3187 2.242 0.142 0.887 5.925 14.712
==============================================================================
>>>res.t_测试('par0=10')
约束测试
==============================================================================
coef标准错误z P>|z |[95.0%配置内部]
------------------------------------------------------------------------------
c0 10.3187 2.242 0.142 0.887 5.925 14.712
==============================================================================
非常感谢,我使用了中描述的引导方法,但您给出的答案似乎更完整,允许我应用更多测试。尽管如此,我还是想知道为什么在这个过程中,我在多次运行同一个脚本之后获得了(有时非常)不同的参数结果。这正常吗?例如,c0在8到20之间变化(当然,改变标准错误)。感谢againNote,我使用scipy拟合结果作为GenericLikelihoodModel的起始参数。通常,这可能没有良好的默认起始值,在某些情况下,目标函数的曲率“不好”。我不知道三参数伽马分布有多好。也许“basinhopping”会为优化提供一个成功的全局最小值。另一个一般性评论:我的猜测是,通常我们会将loc
设置为固定为零,以对正值数据建模。最大似然法通常或一般情况下在估计发行版的支持度时会遇到问题。感谢您的评论。在我的特殊情况下,loc不同于零(实际上,在我的特殊理论框架中,这是一个非常重要的参数),所以我不能将它设置为零。不过,我觉得你的答案很合适,所以我选择了它。如果我需要参数协方差矩阵呢?而不仅仅是标准错误。。
>>> res.t_test(([1, 0, 0], [10]))
<class 'statsmodels.stats.contrast.ContrastResults'>
Test for Constraints
==============================================================================
coef std err z P>|z| [95.0% Conf. Int.]
------------------------------------------------------------------------------
c0 10.3187 2.242 0.142 0.887 5.925 14.712
==============================================================================
>>> res.t_test('par0=10')
<class 'statsmodels.stats.contrast.ContrastResults'>
Test for Constraints
==============================================================================
coef std err z P>|z| [95.0% Conf. Int.]
------------------------------------------------------------------------------
c0 10.3187 2.242 0.142 0.887 5.925 14.712
==============================================================================