У меня есть модель, состоящая из суммы нескольких шагов lmfit StepModel (form = 'erf'), которая очень хорошо подходит для моих данных. Тем не менее, остаток показывает некоторый перекос на каждом шаге. Я могу использовать skew(output.result.residual)
, чтобы дать мне перекос по всему набору данных, но мне бы очень хотелось иметь значение перекоса для каждого компонента модели, то есть перекос 1, связанный с шагом 1, перекос 2 с шагом 2 и т. Д. c.
Я изменил код в examples / doc_builtinmodels_stepmodel.py, чтобы привести пример того, что я имею в виду:
import matplotlib.pyplot as plt
import numpy as np
from lmfit.models import LinearModel, StepModel
x = np.linspace(0, 10, 201)
a = np.ones_like(x)
b = np.ones_like(x)
a[:48] = 0.0
a[48:77] = np.arange(77-48)/(77.0-48)
b[:10] = 0.0
b[10:39] = np.arange(39-10)/(39.0-10)
np.random.seed(0)
a = 110.2 * (a + 9e-3*np.random.randn(x.size)) + 12.0 + 2.22*x
b = 110.2 * (b + 9e-3*np.random.randn(x.size)) + 12.0 + 2.22*x
y = a + b
step_mod = StepModel(form='erf', prefix='s1_')
step2_mod = StepModel(form='erf', prefix='s2_')
line_mod = LinearModel(prefix='line_')
pars = line_mod.make_params(intercept=y.min(), slope=0)
pars += step_mod.guess(y, x=x, center=2.5)
pars += step2_mod.guess(y, x=x, center=2.5)
mod = step_mod + step2_mod + line_mod
out = mod.fit(y, pars, x=x)
out.plot(data_kws={'markersize': 1})
print(skew(out.result.residual))
Я подозреваю, что мне, возможно, придется создавать перекос напрямую в функцию StepModel (), но я признаю, что не знаю, как это сделать.