使用统计模型约束 OLS(或 WLS)系数

Constraining OLS (or WLS) coeffecients using statsmodels

我有一个形式为 model = sm.GLM(y, X, w = weight) 的回归。

这最终成为一个简单的加权 OLS。 (请注意,将 w 指定为错误权重数组实际上在 sm.GLM 中与 sm.WLS 相同,尽管它不在文档中)。

我正在使用 GLM,因为这允许我使用 fit_constrained() 来适应一些额外的约束。我的 X 由 6 个自变量组成,其中 2 个我想将结果系数限制为正。但我似乎无法弄清楚让 fit_constrained() 工作的语法。该文档非常简单,我无法在任何地方找到任何好的示例。我真正需要的是输入这些约束的正确语法。谢谢!

您看到的函数是针对 linear constraints 的,即您的系数的组合满足一些线性等式,而不是用于定义边界。

最接近的是使用 scipy least squares 并定义边界,例如,我们设置了一些具有 6 个系数的数据集:

from scipy.optimize import least_squares
import numpy as np

np.random.seed(100)
x = np.random.uniform(0,1,(30,6))
y = np.random.normal(0,2,30)

基本矩阵相乘的函数和return错误:

def fun(b, x, y):
    return b[0] + np.matmul(x,b[1:]) - y

第一个系数是截距。假设我们要求第 2 和第 6 始终为正数:

res_lsq = least_squares(fun, [1,1,1,1,1,1,1], args=(x, y),
                        bounds=([-np.inf,0,-np.inf,-np.inf,-np.inf,-np.inf,0],+np.inf))

然后我们检查结果:

res_lsq.x

array([-1.74342242e-01,  2.09521327e+00, -2.02132481e-01,  2.06247855e+00,
       -3.65963504e+00,  6.52264332e-01,  5.33657765e-20])