Как рассчитать хи-квадрат на градус свободы для нелинейной кривой, подходящей для scipy? - PullRequest
0 голосов
/ 28 февраля 2020

Я использовал scipy.optimise.curve_fit в следующем коде для успешного выполнения нелинейного подбора гауссовской функции для измеренных данных и извлечения параметров:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.stats.distributions import t

xdata = np.genfromtxt("Cs-137 peak.tsv", skip_header = 2, usecols = (0))
ydata = np.genfromtxt("Cs-137 peak.tsv", skip_header = 2, usecols = (1))

##This is the function we want to fit our data

def func(xdata, H0, sigma, A):
    return (A/(sigma*np.sqrt(2*np.pi)))*np.exp((-(xdata-H0)**2)/(2*sigma**2))

initial_guess = [243, 13, 65000]
pars, pcov = curve_fit(func, xdata, ydata, p0 = initial_guess)

alpha = 0.32 #68% confidence interval = 100*(1-alpha)

n = len(xdata)
p = len(pars)

dof = max(0, n-p)

#student-t value for the dof and confidence level
tval = t.ppf(1.0-alpha/2.,dof)

for i, p,var in zip(range(n), pars, np.diag(pcov)):
    sigma1 = var**0.5
    print (p, "+-", sigma1*tval)

plt.plot(xdata, ydata, 'bo')
xfit = np.linspace(200,300)
yfit = func(xfit, pars[0], pars[1], pars[2])
plt.plot(xfit, yfit)
plt.legend(['data', 'fit'], loc = 'best')
plt.show()

Теперь я хочу найти способ расчета хи-квадрат на градус свободы для этой подгонки, но я не знаю, как это сделать.

...