【问题标题】:Constraining OLS (or WLS) coeffecients using statsmodels使用 statsmodels 约束 OLS(或 WLS)系数
【发布时间】:2021-02-28 03:04:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: python constraints regression statsmodels


    【解决方案1】:

    您看到的函数适用于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)
    

    基本矩阵乘法并返回错误的函数:

    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])
    

    【讨论】:

    • 对第一句的更正应该是:“满足一些线性等式”,statsmodels 不支持可以绑定的不等式约束。在这种情况下,推理是非标准且困难的
    • 我已经找到了解决此问题的方法,但仍然感谢您的简洁解释!
    • 感谢@josef 的更正。很高兴您还找到了解决方法 wj wj
    猜你喜欢
    • 1970-01-01
    • 2020-11-23
    • 2023-02-15
    • 2019-09-07
    • 2018-10-17
    • 2014-12-19
    • 1970-01-01
    • 2017-03-30
    • 2019-09-08
    相关资源
    最近更新 更多