gpt4 book ai didi

python - 当 y 误差不对称时如何计算线性拟合斜率的误差

转载 作者:行者123 更新时间:2023-11-28 19:21:32 25 4
gpt4 key购买 nike

我有一个数据集,其中的值可以绘制为 x 值对 y 值。y轴上的数据存在不对称误差,即

y_i=10^{+2}_{-1.5}

我想用线性函数拟合这些数据。我可以在 python 中以多种方式完成此拟合,但它们都有相同的问题,即如何也获取拟合参数的错误。

this 非常相关, 但不可能(或者至少,不直接)使用 scipy.optimize.curve_fit因为我的数据在纵坐标(y 轴)上有不对称误差,以便获得斜率误差。

那么,当 y 误差条不对称时,如何计算线性拟合斜率的误差?

有什么 python 函数吗?

最佳答案

Barlow+04 有一篇论文 https://arxiv.org/abs/physics/0406120寻找具有不对称误差条的变量的平均值。您也许可以使用这些技术。

我采用的强力方法是从 split 正态分布 (https://en.wikipedia.org/wiki/Split_normal_distribution) 中提取变量的许多实现,并为它们存储最合适的多项式参数。然后,我为每个多项式参数计算中位数和 1-sigma 上/下误差条(分别来自中位数的第 84 个和第 16 个百分位数)。

下面的代码在 Python 2.7.9 中执行此操作。有一个用于计算 split 法线值、百分位数误差和拟合多项式的函数。

希望这对您有所帮助。

#! /bin/python

from random import choice, gauss
from numpy import polyfit

def split_normal(mus, sigmas_u68, sigmas_l68):
"""
RET: A split-normal value.
"""

split_normal = []

for mu, sigma_u68, sigma_l68 in zip(mus, sigmas_u68, sigmas_l68):

sigma = choice([sigma_u68, -sigma_l68])
g = abs(gauss(0.0, 1.0)) * sigma + mu
split_normal.append(g)

return split_normal

def errors_84_16(x):
"""
RET: 1-sigma upper/lower error bars from the 84/16th percentile
from the median.
"""

n = len(x)

index_med = n / 2 # median.
index_84 = int(round(n * 0.84135)) # 84th percentile from median.
index_16 = int(round(n * 0.15865))

x_sorted = sorted(x)
x_med = x_sorted[index_med]
x_u68 = x_sorted[index_84] - x_med # 1-sigma upper error.
x_l68 = x_med - x_sorted[index_16] # 1-sigma lower error.

return x_med, x_u68, x_l68

def assymetric_polyfit(x, y, y_u68, y_l68, n_mc=500):
"""
DES: Solves y = a + b * x for assymentric y error bars.
RET: [a, a_u68, a_l68, b, b_u68, b_l68].
"""

a_mc = []
b_mc = []

for i in xrange(0, n_mc):
y_mc = split_normal(y, y_u68, y_l68)
pars = polyfit(x, y_mc, 2)
a_mc.append(pars[2])
b_mc.append(pars[1])


a, a_u68, a_l68 = errors_84_16(a_mc)
b, b_u68, b_l68 = errors_84_16(b_mc)

return a, a_u68, a_l68, b, b_u68, b_l68

def example():
"""
"""

x = [1.0, 2.0, 3.0, 4.0, 5.0]
y = [5.0, 8.0, 11.0, 14.0, 17.0] # 2 + 3x
y_u68 = [0.5, 0.5, 0.5, 0.5, 0.5]
y_l68 = [1.5, 1.5, 1.5, 1.5, 1.5]

pars = assymetric_polyfit(x, y, y_u68, y_l68)
print(pars)

if __name__ == '__main__':

example()

关于python - 当 y 误差不对称时如何计算线性拟合斜率的误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23902157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com