Python 如何向StepModel添加倾斜

Python 如何向StepModel添加倾斜,python,skew,lmfit,Python,Skew,Lmfit,我有一个由几个lmfit StepModel(form='erf')步骤组成的模型,它非常适合我的数据。然而,残差在每一步都显示出一些偏差。我可以使用skew(output.result.residual)来给我整个数据集上的skew,但我真正想要的是模型的每个组件都有一个skew值,即,与step1关联的skew1,与step2关联的skew2,等等 我已经更改了examples/doc\u builtinmodels\u stepmodel.py中的代码,以举例说明我的意思: import

我有一个由几个lmfit StepModel(form='erf')步骤组成的模型,它非常适合我的数据。然而,残差在每一步都显示出一些偏差。我可以使用
skew(output.result.residual)
来给我整个数据集上的skew,但我真正想要的是模型的每个组件都有一个skew值,即,与step1关联的skew1,与step2关联的skew2,等等

我已经更改了examples/doc\u builtinmodels\u 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()函数中构建歪斜,但我承认我真的不知道该怎么做。

我不确定我是否理解您的意图-拟合残差的歪斜?我也不明白你想让
skew1
skew2
做什么。有两个带有线性渐变和附加线性项的阶跃函数。偏度是从哪里来的?运行上面的示例代码返回一个带有两个锯齿波的残差。如果我在模型上运行skew(out.result.residual),我会得到整个数据范围的倾斜。相反,我希望每个锯齿分别有倾斜,这样我就可以看到某个锯齿是左倾斜还是右倾斜。好的,您可以提取模型三个组件的曲线(请参见
ModelResult.eval_components()
)。也许从数据中减去每一个?我不知道你会怎么做,如果组件重叠明显,但也许这将有助于。。。我仍然不明白你想要一个
skew
参数做什么。