简体   繁体   中英

Asymmetric error bars in Scipy's odrpack

I am using Scipy's odrpack to fit a linear function to some data that has uncertainties in both the x and y dimensions. Each data point has it's own uncertainty that is asymmetric.

I can fit a function using symmetric uncertainties, but this is not a true representation of my data.

How can I perform the fit with this in mind?

This is my code so far. It receives input data as a command line argument, and the uncertainties i'm using are just random numbers at the moment. (also, two fits are happening, one for positive data points another for the negative. The reasons are unrelated to this question)

import sys
import numpy as np
import scipy.odr.odrpack as odrpack

def f(B, x):
    return B[0]*x + B[1]

xdata = sys.argv[1].split(',')
xdata = [float(i) for i in xdata]
xdata = np.array(xdata)

#find indices of +/- data
zero_ind = np.where(xdata >= 0)[0][0]

x_p = xdata[zero_ind:]
x_m = xdata[:zero_ind+1]

ydata = sys.argv[2].split(',')
ydata = [float(i) for i in ydata]
ydata = np.array(ydata)

y_p = ydata[zero_ind:]
y_m = ydata[:zero_ind+1]

sx_m = np.random.random(len(x_m))
sx_p = np.random.random(len(x_p))

sy_m = np.random.random(len(y_m))
sy_p = np.random.random(len(y_p))

linear = odrpack.Model(f)

data_p = odrpack.RealData(x_p, y_p, sx=sx_p, sy=sy_p)
odr_p = odrpack.ODR(data_p, linear, beta0=[1.,2.])
out_p = odr_p.run()

data_m = odrpack.RealData(x_m, y_m, sx=sx_m, sy=sy_m)
odr_m = odrpack.ODR(data_m, linear, beta0=[1.,2.])
out_m = odr_m.run()

Thanks!

I will just give you solution with random data,I could not bother to import your data

import numpy as np
import scipy.odr.odrpack as odrpack
np.random.seed(1)

N = 10
x = np.linspace(0,5,N)*(-1)
y = 2*x - 1 + np.random.random(N)
sx = np.random.random(N)
sy = np.random.random(N)

def f(B, x):
    return B[0]*x + B[1]
linear = odrpack.Model(f)
# mydata = odrpack.Data(x, y, wd=1./np.power(sx,2), we=1./np.power(sy,2))
mydata = odrpack.RealData(x, y, sx=sx, sy=sy)

myodr = odrpack.ODR(mydata, linear, beta0=[1., 2.])
myoutput = myodr.run()
myoutput.pprint()

Than we got

Beta: [ 1.92743947 -0.94409236]
Beta Std Error: [ 0.03117086  0.11273067]
Beta Covariance: [[ 0.02047196  0.06690713]
 [ 0.06690713  0.26776027]]
Residual Variance: 0.04746112419196648
Inverse Condition #: 0.10277763521624257
Reason(s) for Halting:
  Sum of squares convergence

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM