如何在曲线拟合时将误差包含在输入数组中
评论:我在这里输入大部分的函数。
假设我有这个数据集
X Y Err
1.75000000e+00 1.35782019e+03 5.30513124e-01
1.50000000e+00 1.35253305e+03 5.30038166e-01
1.25000000e+00 1.34828730e+03 3.74007356e-01
1.00000000e+00 1.34305172e+03 6.01032718e-01
7.50000000e-01 1.33856734e+03 4.10658016e-01
5.00000000e-01 1.33354481e+03 3.75859437e-01
2.50000000e-01 1.32768190e+03 6.87483944e-01
0.00000000e+00 1.32243488e+03 1.01751280e+00
我可以用几种方法来进行拟合(使用Python)。polyfit(X,Y,1)
只返回斜率和截距,没有误差估计。scipy.optimize.curve_fit(linear_func,X,Y)
返回
(array([ 20.03165298, 1322.9624529 ]), array([[ 0.08707502, -0.07619064],
[-0.07619064, 0.09523831]]))
其中 linear_func(X,a,b)
返回 (a*X+b)
,这意味着斜率和截距的误差都是0.09,这个值考虑到我测量的误差来说太低了。我把误差作为权重包含进去(这是我找到的唯一包含误差的方法),scipy.optimize.curve_fit(linear_func,X,Y,sigma=1/E)
结果是
(array([ 20.30379913, 1322.49139001]), array([[ 0.02571288, -0.00776912],
[-0.00776912, 0.00959137]]))
这里的误差甚至更小。四处查找后,我发现了 statsmodel
,它使用 OLS
得到的结果是
coef std err t P>|t| [95.0% Conf. Int.]
------------------------------------------------------------------------------
const 1322.9625 0.309 4286.883 0.000 1322.207 1323.718
x1 20.0317 0.295 67.884 0.000 19.310 20.754
看起来合理,虽然有点小。
最后,使用 WLS
得到的结果是
coef std err t P>|t| [95.0% Conf. Int.]
------------------------------------------------------------------------------
const 1323.2200 0.337 3928.369 0.000 1322.396 1324.044
x1 19.8639 0.314 63.234 0.000 19.095 20.633
大致相同。
所以,我的问题是,这两种方法有什么区别(我假设 OLS
和 WLS
和 curve_fit
的加权误差是一样的)?有没有办法手动估计拟合参数的误差?
2 个回答
OLS和curve_fit在没有权重的情况下,假设每个观察值的误差方差是相同的。
curve_fit
和WLS
则假设你的误差方差是和你给的权重的倒数成正比的。你指定的权重的绝对值并不会影响参数的标准误差,只有权重的相对大小才是重要的。
scipy的curve_fit最近增加了一个选项absolute_sigma=False
,如果设置为真,就会把权重的倒数当作绝对值来使用,而不是相对大小。
从问题来看,我不太确定这是否是相关的答案。
在线性模型中,假设是y = X * beta + u
,其中u是误差,假设这些误差彼此独立,但方差是变化的,计算方式是sig2_u / weights
。
sig2_u
是从实际残差或估计误差中估算出的总体方差。
absolute_sigma=True
意味着我们将sig2_u
设为1,而不是从拟合的回归中进行估算。
Yotam,你写道
scipy.optimize.curve_fit(linear_func,X,Y) returns
(array([ 20.03165298, 1322.9624529 ]), array([[ 0.08707502, -0.07619064],
[-0.07619064, 0.09523831]]))
where linear_func(X,a,b) returns (a*X+b) this mean that the error both in
the slope and intercept is 0.09 which is too low considering the error I
have in the measurement.
这不对。curve_fit()返回的第二个部分是协方差矩阵,所以估计的不确定性应该是sqrt(0.087075)和sqrt(0.0952383),大约是0.3,这个值更接近正确的范围,特别是因为这些值是1-sigma值,而不是3-sigma值。
关于权重的含义和使用absolute_sigma的其他评论也适用。