简体   繁体   中英

Constrained regression in Python with multiple constraints

I am currently working on setting up a constrained regression in Python using

import statsmodels.api as sm

model = sm.GLM(Y,X)    
model.fit_constrained 

'''Setting the restrictions on parameters in the form of (R, q), where R 
and q are constraints' matrix and constraints' values, respectively. As
for the restriction in the aforementioned regression model, i.e., 
c = b - 1 or b - c = 1, R = [0, 1, -1] and q = 1.'''

function from StatsModel but running into some issues when I try to set it up with multiple constraints. I have seven coefficients, including a constant. I want to set it up so that a weighted sum of dummy 1 and dummy 2 equals zero and a weighted sum of dummy 3 and dummy 4 equals zero. To use a single constraint example,

results = model.fit_constrained(([0, 0, 0, a, b, 0, 0], 0))

where a and b are the weights on dummy 3 and dummy 4 and are variables I've predefined.

If I didn't have the a and b variables, and the dummies were equally weighted, I could just use the syntax

fit_constrained('Dummy1 + Dummy2, Dummy3 + Dummy4')

but when I try to use a similar syntax using

results = model.fit_constrained(([0, 0, 0, a, b, 0, 0], 0),([0, c, d, 0, 0, 0, 0], 0)) 

I get the error

ValueError: shapes (2,) and (7,6) not aligned: 2 (dim 0) != 7 (dim 0)

Does anyone have any ideas? Thanks so much!

I am still not sure which model you are running (posting a Minimal, Complete, and Verifiable example would certainly help), but the following should work for GLMs. From the docs , we have,

constraints ( formula expression or tuple ) – If it is a tuple, then the constraint needs to be given by two arrays (constraint_matrix, constraint_value), ie (R, q). Otherwise, the constraints can be given as strings or list of strings. see t_test for details.

This implies the function call should be along the following lines,

R = [[0, 0, 0, a, b, 0, 0],
     [0, c, d, 0, 0, 0, 0]]
q = [0, 0]

results = model.fit_constrained((R, q))

This should work, but since we do not have your model I do not know for sure if R * params = q , which must hold according to the documentation.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM