如何从ODR结果计算标准误差?

Ger*_*Ger 7 python regression numpy curve-fitting scipy

我使用的scipy.odr是为了在这个问题上对x和y的不确定性进行拟合,使用scipy curve_fit进行正确拟合,包括x中的误差?

在拟合之后,我想计算参数的不确定性.因此,我查看协方差矩阵的对角元素的平方根.我明白了:

>>> print(np.sqrt(np.diag(output.cov_beta)))
[ 0.17516591  0.33020487  0.27856021]
Run Code Online (Sandbox Code Playgroud)

Output也有output.sd_beta是,根据上ODR DOC

形状(p,)的估计参数的标准误差.

但是,它没有给我相同的结果:

>>> print(output.sd_beta)
[ 0.19705029  0.37145907  0.31336217]
Run Code Online (Sandbox Code Playgroud)

编辑

这是笔记本上的一个例子:https://nbviewer.jupyter.org/github/gvallverdu/cookbook/blob/master/fit_odr.ipynb

至少方形

stop reason: ['Sum of squares convergence']
        params: [ -1.94792946  11.03369235  -5.43265555]
          info: 1
       sd_beta: [ 0.26176284  0.49877962  0.35510071]
sqrt(diag(cov): [ 0.25066236  0.47762805  0.34004208]
Run Code Online (Sandbox Code Playgroud)

使用ODR

stop reason: ['Sum of squares convergence']
        params: [-1.93538595  6.141885   -3.80784384]
          info: 1
       sd_beta: [ 0.6941821   0.88909997  0.17292514]
sqrt(diag(cov): [ 0.01093697  0.01400794  0.00272447]
Run Code Online (Sandbox Code Playgroud)

ali*_*i_m 7

差异的原因sd_beta是由剩余方差缩放,而cov_beta不是.

scipy.odr是ODRPACK FORTRAN库的接口,它包含在内__odrpack.c.sd_betacov_beta通过索引到workFORTRAN例程内部使用的向量来恢复.在他们的第一个元素的索引work是命名变量sdvcv(见这里).

ODRPACK文档(第85页):

WORK(SDI)是包含函数参数的标准偏差的p × 1数组的第一个元素,即协方差矩阵的对角条目的平方根,其中SD???K?

WORK(SDI-1+K) = SD(K) = ?V 1/2 ? (K, K) = ???K
Run Code Online (Sandbox Code Playgroud)

K = 1,... ,p.

WORK(VCVI)p × p数组的第一个元素,VCV包含在? 按残差方差缩放之前参数的协方差矩阵的值,其中

WORK(VCVI-1+I+(J-1)*(NP)) = VCV(I,J) = ???²V ?(I, J)
Run Code Online (Sandbox Code Playgroud)

I = 1,... ,pJ = 1,... ,p.

换句话说,np.sqrt(np.diag(output.cov_beta * output.res_var))会给你相同的结果output.sd_beta.

我在这里打开了一个错误报告.

  • @Gabriel 不,`output.cov_beta` *应该*由残差方差缩放,但默认情况下不是(因此您需要将其乘以`output.res_var`)。 (2认同)