具有多个输入但只有一个预测变量的 Lmfit 回归

Lmfit Regression with multiple inputs but only one predictor variable

我正在尝试拟合如下所述的函数:

Y = 10*(b+5/c0+c1*x) 假设 x 是预测变量,Y 是预测变量。

但是,b 也是一个与 x 和 y 长度相同的数组,并且它随每个 x 值而变化。 我定义函数如下:

def func(x,b,c0,c1):
    return 10*(b+5/c0+c1*x)

其中 x 是预测变量 b 是一个与 X 长度相同的数组(每个 x 值都有对应的 b 值) c0 和 C1 是模型系数

我正在尝试使用 lmfit 模块在 y 和 x 之间执行回归,但是,我似乎无法将参数定义为数组。

下面的代码给出了以下错误:

model = Model(func)
params = model.make_params(b=data["b"].values,c0=0.429, c1=0.867)
result = model.fit(Y, params, X=x,calc_covar=True)



"ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()"

我只对 y 和 x 之间的关系感兴趣,那么这种做法在统计上是错误的吗? 谢谢

在lmfit的语言中,你的b是“独立数据”,就像x一样,它是一个预测变量,而不是一个要在拟合中优化的变量。

默认情况下,模型函数的第一个参数被假定为唯一的独立变量。不是具有非数字默认值的关键字参数的函数参数将被转换为适合的变量参数。

但是您可以指定与

不同的或其他独立的数据
model = Model(func, independent_vars=['x', 'b'])
params = model.make_params(c0=0.429, c1=0.867)
result = model.fit(Y, params, X=x, b=data['b'], calc_covar=True)

FWIW,b 是一个与 x 长度相同的数组这一事实实际上对 lmfit.Model 并不重要:自变量可以是任何类型。所以,你可以把你的模型函数写成

def func(predictor, c0, c1):
    return 10*(predictor['b']+5/c0+c1*predictor['x'])

然后将其用作

model = Model(func)
params = model.make_params(c0=0.429, c1=0.867)
result = model.fit(Y, params, predictor={'x':x, b: data['b']}, calc_covar=True)

这似乎有点过分了,但它可以帮助解决更复杂的问题。