LMFIT在Python中计算置信区间、不确定性估计误差

3

输出错误信息如下: MinimizerException: 没有合理的不确定性估计,无法确定置信区间

为什么会出现这个错误?我该如何计算不确定性估计并解决这个问题?

for dosya1 in glob.glob("mean*"):
     data1=np.genfromtxt(dosya1, skip_header=0, skip_footer=0, names=["wavelength","mean"])
     x=data1["wavelength"]

     mod=VoigtModel()
     pars = mod.guess(y, x=x)
     pars['gamma'].set(value=0.7, vary=True, expr="")     
out=mod.fit(y,pars, x=x)

     pars=lmfit.Parameters()
     pars.add_many(('amp', out.params["amplitude"].value), ('sig', out.params["sigma"].value), ("gam",out.params["gamma"].value),("cent",out.params["center"].value))

 def residual(p):
     amp=p["amp"].value
     sig=p["sig"].value
     gam=p["gam"].value
     cent=p["cent"].value  
     return  ((wofz((x-cent + wofz(gam).imag)/(sig*(sqrt(2)))).real) / (sig*(sqrt(2))))- y

 mini = lmfit.Minimizer(residual, pars)
 result=mini.minimize()

 ci = lmfit.conf_interval(mini, result)
 lmfit.printfuncs.report_ci(ci)  

请问您能否提供有关残差函数格式的更多信息?wofz是什么?我假设由于您的最小化例程已完成,因此在残差中返回了一个扁平化数组。您可以尝试的一件事是为您定义的参数添加合理的边界或将置信区间计算限制在几个参数上以开始诊断。例如 params.add('gamma', value=-0.7, max=0, min=4)lmfit.conf_interval(mini, result, p_names=['gamma'] 您使用的lmfit版本是什么? - XtremeJake
1个回答

4
如果 lmfit.minimize()(实际上是调用的leastsq())无法通过反转曲率矩阵来估计不确定性,则会出现此错误消息。它使用这些值(顺便说一下,这些值通常是非常好的估计值)作为明确探索参数空间的比例尺。有几个可能的原因导致leastsq()无法估计不确定性。常见原因是找不到一个或多个变量来改变拟合,或残差包含NaN。很难预测何时会发生这种情况。在调用conf_interval()之前,您应该允许这种可能性和/或检查初始拟合是否成功并能够对不确定性进行初始估计(检查result.errorbars)。

感谢Matt在lmfit上的工作。如果估计不确定性失败时,您能给出其他建议吗?即当没有变量没有影响且残差不包含NaN时。 我的印象是leastsq经常无法产生协方差矩阵。是否有其他方法来获取置信区间? - dnalow
这可能取决于为什么不确定性估计失败的细节。如果所有变量都有有限的影响,并且没有NaN,则应该可以工作 - 它不应该“经常”失败。你有多个它失败的例子吗?此外,StackOverflow不适合进行这样的讨论,不应该鼓励在其中提出lmfit问题。请移步到适当的邮件列表。 - M Newville
遇到了同样的问题,没有产生协方差矩阵。请问应该在哪个邮件列表中寻求帮助? - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接