782*_*219 3 python linear-regression statsmodels
我开发了一种算法来循环 15 个变量并为每个变量生成一个简单的 OLS。然后算法再循环 11 次以产生相同的 15 个 OLS 回归,但 X 变量的滞后每次增加 1。我选择具有最高 r^2 的自变量,并使用 3,4 或 5 个变量的最佳滞后
IE
Y_t+1 - Y_t = B ( X_t+k - X_t) + e
Run Code Online (Sandbox Code Playgroud)
我的数据集如下所示:
Regression = pd.DataFrame(np.random.randint(low=0, high=10, size=(100, 6)),
columns=['Y', 'X1', 'X2', 'X3', 'X4','X5'])
Run Code Online (Sandbox Code Playgroud)
到目前为止,我拟合的 OLS 回归使用以下代码:
Y = Regression['Y']
X = Regression[['X1','X2','X3']]
Model = sm.OLS(Y,X).fit()
predictions = Model.predict(X)
Model.summary()
Run Code Online (Sandbox Code Playgroud)
问题是,使用 OLS,您可以获得负系数(我就是这样做的)。我非常感谢您通过以下方式限制该模型的帮助:
sum(B_i) = 1
B_i >= 0
Run Code Online (Sandbox Code Playgroud)
这效果很好,
from scipy.optimize import minimize
# Define the Model
model = lambda b, X: b[0] * X[:,0] + b[1] * X[:,1] + b[2] * X[:,2]
# The objective Function to minimize (least-squares regression)
obj = lambda b, Y, X: np.sum(np.abs(Y-model(b, X))**2)
# Bounds: b[0], b[1], b[2] >= 0
bnds = [(0, None), (0, None), (0, None)]
# Constraint: b[0] + b[1] + b[2] - 1 = 0
cons = [{"type": "eq", "fun": lambda b: b[0]+b[1]+b[2] - 1}]
# Initial guess for b[1], b[2], b[3]:
xinit = np.array([0, 0, 1])
res = minimize(obj, args=(Y, X), x0=xinit, bounds=bnds, constraints=cons)
print(f"b1={res.x[0]}, b2={res.x[1]}, b3={res.x[2]}")
#Save the coefficients for further analysis on goodness of fit
beta1 = res.x[0]
beta2 = res.x[1]
beta3 = res.x[2]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3992 次 |
| 最近记录: |