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

问题描述

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

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,predictor={'x':x,b: data['b']},calc_covar=True)

这在这里似乎有点矫枉过正,但它可以帮助解决更复杂的问题。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...