对于odr.set_job(fit_type=2)
(普通最小二乘法)odr.set_job(fit_type=0)
(显式ODR),对于相同数据的两种拟合类型,不确定性sd_beta
和协方差矩阵cov_beta
显著不同-仅在y部分存在误差
有人知道这是从哪里来的吗?
下面是一个复制效果的代码示例。
另一方面:对于sd_beta
和cov_beta
之间的隐藏比例因子,我在这里找到了一些帮助:How to compute standard error from ODR results?
import numpy as np
import scipy.odr as spodr
def linear_func(pars, x):
"""Define a (linear) function to fit the data with."""
a, b = pars
return b * x + a
x = np.asfarray( [1.01585124, 2.03965699, 2.89148684] )
y = np.asfarray( [1.16201599, 2.15275179, 2.87248892] )
dy = np.asfarray( [0.15520856, 0.33160654, 0.45461028] )
real_data = spodr.RealData(x, y, sy=dy)
linear_model = spodr.Model(linear_func)
odr = spodr.ODR(real_data, linear_model, beta0=[0., 1.])
# fit_type=2 means least square fit
odr.set_job(fit_type=2)
out = odr.run()
print('fit_type=2 -------------------------------------------')
out.pprint()
print('\n')
# fit_type=0 means explicit ODR
odr.set_job(fit_type=0)
out = odr.run()
print('fit_type=0 -------------------------------------------')
out.pprint()
给出以下结果:
fit_type=2 -------------------------------------------
Beta: [0.22131257 0.92950773]
Beta Std Error: [0.0444006 0.03004 ]
Beta Covariance: [[ 0.10678885 -0.06586652]
[-0.06586652 0.04888189]]
Residual Variance: 0.01846085213372428
Inverse Condition #: 0.02685695006039764
Reason(s) for Halting:
Sum of squares convergence
fit_type=0 -------------------------------------------
Beta: [0.24510628 0.91688192]
Beta Std Error: [0.07210707 0.03482789]
Beta Covariance: [[ 2.29687687 -1.03022278]
[-1.03022278 0.53584146]]
Residual Variance: 0.0022636956774060857
Inverse Condition #: 0.017439127336256896
Reason(s) for Halting:
Sum of squares convergence
事实证明,这不是一个不一致的问题,而是一个陷阱。 当然,对于普通最小二乘法(OLS),x误差实际上为零,因为它们不会出现在数学模型中
现在,认为在ODR案例中省略
sx
意味着sx
→ 0不正确。实际上,对于sx=None
,sx
默认为unity,请参见here。当然,这会产生与OLS情况不同的结果这里,如下所示显式设置
sx=data.x*ResEps
会得到相同的结果至少,应该在文档中更明确地指出这一点,我将尝试就此准备一个问题。有趣的是,在代码中,同时传递
sx
和covx
会发出警告(这是有意义的),但如果两者都没有给出,则会出现上述情况屈服
相关问题 更多 >
编程相关推荐