如何使用带有误差的卡方来拟合常数

问题描述 投票:0回答:1

我正在尝试使用卡方作为拟合统计量来拟合一个常数。我试图拟合的常数不是一个简单的缩放常数,而是输入到输出值的方程中。

const -> fn -> 值和错误

这里有大量关于卡方检验的帖子,但我找不到任何关于使用它来拟合值和/或允许有错误的数据的版本,其中:

chi2 =(观察值 - 预期值)** 2 /(观察值中的 1 西格玛误差)** 2

您能告诉我该怎么做吗? 谢谢,

statistics curve-fitting
1个回答
0
投票

让我们构建一个 MCVE 来解决您的问题:

import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize, special

假设您有两个任意函数用于模型和误差:

def model(x, a):
    return special.expit(a * x) 

def error(x, a):
    return 0.01 * a * (np.abs(x) + 1e-6) + 0.01

我们可以为卡方统计构建一个包装器:

def loss_factory(x, y):
    def wrapped(a):
        return np.sum(np.power((y - model(x, a)) / error(x, a), 2))
    return wrapped

我们生成一些综合数据:

np.random.seed(12345)
a = 3.5
x = np.linspace(-1, 1, 30)
y = model(x, a)
s = error(x, a)
n = s * np.random.normal(size=x.size)
yn = y + n

并产生相关损失:

loss = loss_factory(x, yn)

现在我们将最小化参数

a
的损失,知道
x
y
s

solution = optimize.minimize(loss, x0=[3.])
#       fun: 36.084631813621556
#  hess_inv: array([[0.00449676]])
#       jac: array([-3.81469727e-06])
#   message: 'Optimization terminated successfully.'
#      nfev: 18
#       nit: 8
#      njev: 9
#    status: 0
#   success: True
#         x: array([3.49451316])

返回卡方 (

solution.fun
) 和最优参数 (
solution.x
)。

我们可以检查是否合身:

以及解决方案相对于损失函数的最优性:

© www.soinside.com 2019 - 2024. All rights reserved.