我有两个坐标分别为x_1,2和y_1,2的点。 y是一个测量值,具有不确定性。
我可以很容易地计算出适合这两点的直线。
我还可以估计与斜率和截距相关的不确定性。
我想计算/画一个置信带。
通常,我会通过以下方式做到这一点:
serr = np.sqrt(np.sum(residuals**2)/(n - 2))
t = stats.t.ppf(1-0.05/2, n - 2)
confint = t * serr * np.sqrt(1./n + (x - np.mean(x))**2/np.sum((x-np.mean(x))**2))
由于自由度为0,n = 2,因此无法使用标准误差和学生分布的标准方法。
有没有其他方法可以使用与斜率和截距相关的不确定性来估计(和显示)置信区间?
谢谢
最佳答案
我想这应该是“简单”的错误传播。您将y
-错误传播到斜率和截距中,在此必须注意这些错误将被关联。利用已知的误差和相关性,可以计算出y
对给定x
的误差
我会这样:
import matplotlib.pyplot as plt
import numpy as np
"""
y = a + b x
"""
xl = [ 1, 2 ] ### x1 , x2
yl = [ .6, 1.8 ] ### y1 , y2
yerr = [ .5, .3 ] ### s1, s2
b = ( yl[1] - yl[0] ) / ( xl[1] - xl[0] ) ### deltaX / deltaY
a = yl[0] - b * xl[0]
xnp = np.linspace( -.5, 3, 200 )
ynp = np.fromiter( ( a + b * x for x in xnp ), np.float)
"""
Joel Tellinghuisen
J. Phys. Chem. A 2001, 105, 3917-3921
transformation of errors provides
(a) ( s1^2 ( 1 + x1 / delatX )^2 + s2^2 ( x1 / deltaX )^2 , -s1^2 ( 1 + x1 / deltaX ) / deltaX - s2^2 x1 / deltaX^2 )
( ) -> ( )
(b) ( -s1^2 ( 1 + x1 / deltaX ) / deltaX - s2^2 x1 / deltaX^2 , ( s1^2 + s2^2 ) / deltaX^2 )
from this we calculate sy^2 = sa^2+ sb^2 x^2 + 2 sab^2 x:
"""
def sy( x ):
s1, s2 = yerr
x1, x2 = xl
dx = x2 - x1
out = ( s1 * ( 1 + x1 / dx ) )**2
out += ( s2 * x1 / dx )**2
out += ( s1**2 + s2**2 ) / dx**2 * x**2
out -= 2 * ( s2**2 * x1 / dx**2 + s1**2 * ( 1 + x1 / dx ) / dx ) * x
return np.sqrt( out )
ynpbp = np.fromiter( ( a + b * x + sy(x) for x in xnp ), np.float)
ynpbm = np.fromiter( ( a + b * x - sy(x) for x in xnp ), np.float)
ye = np.fromiter( ( sy(x) for x in xnp ), np.float)
fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1 )
ax.errorbar( xl, yl, yerr=yerr, marker='s', ls='' )
ax.plot( xnp, ynp )
ax.plot( xnp, ynpbp )
ax.plot( xnp, ynpbm )
ax.plot( xnp, ye )
ax.grid()
plt.show()
这给了我以下情节
关于python - 对具有不确定性的两个数据点进行线性拟合的置信区间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58837553/