python - 使用 statsmodels 约束 OLS(或 WLS)系数
问题描述
我有一个回归的形式model = sm.GLM(y, X, w = weight)
。
最终成为一个简单的加权 OLS。(请注意,将 w 指定为错误权重数组实际上在 sm.GLM 中与 sm.WLS 相同,尽管它不在文档中)。
我使用 GLM 是因为这允许我使用 fit_constrained() 来适应一些额外的约束。我的 X 由 6 个自变量组成,其中 2 个我想将结果系数约束为正。但我似乎无法弄清楚让 fit_constrained() 工作的语法。该文档非常简单,我在任何地方都找不到任何好的示例。我真正需要的是用于估算这些约束的正确语法。谢谢!
解决方案
您看到的函数适用于线性约束,即您的系数组合满足一些线性等式,而不是用于定义边界。
您可以获得的最接近的是使用scipy 最小二乘法并定义边界,例如,我们设置了一些具有 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])
推荐阅读
- c# - InvalidOperationException:无法为“CoronaAppCsarp.Pages.Index”类型的属性“_clientFactory”提供值
- google-cloud-platform - 云发布订阅消息排序是否意味着在确认前一条消息之前不会传递后续消息?
- nodemailer - Nodemailer - 超过了 24 小时的发送限制
- youtube - YouTube API 是否有 webhook 或套接字?有新评论时通知我?[塞拉达]
- javascript - Nodejs - 数组不返回任何内容
- javascript - 使用 javascript 更新按钮的文本
- java - 子类使用自身内部的另一个子类扩展同一个超类
- python - 出于某种原因,我不断得到一个 unindent 不匹配任何外部缩进级别(我刚开始 python)
- c# - 如何同步执行异步方法?
- c - C中的指针和循环