2017-01-27 3 views
0

Ich habe diese einfache Regressionsmodell:Constrained Regression in Python

y = a + b * x + c * z + error 

mit einer Einschränkung für Parameter:

c = b - 1 

Es gibt ähnliche Fragen auf SO geschrieben (wie Constrained Linear Regression in Python). Der Typ der Einschränkungen ist jedoch lb <= parameter =< ub.

Welche Optionen stehen zur Verfügung, um dieses spezielle eingeschränkte lineare Regressionsproblem zu lösen?

+0

algebraisch beseitigen b oder c, tun die Regression und calc c oder b könnte sogar die Algebra in sympy tun, wenn es kompliziert genug waren – f5r5e5d

+0

zu rechtfertigen @ f5r5e5d algebraische Eliminierung von b oder c führt zu einem anderen eingeschränkten Modell. Um genauer zu sein, kann man die ursprüngliche Regressionsgleichung wie folgt umschreiben: y = a + b * (x + z) - z + Fehler, was äquivalent zu y = a + b * w - d * z + Fehler, s. d = 1 '(wobei "w", der neue Regressor, "x + z" ist). Darüber hinaus leidet diese Neuformulierung des ursprünglichen Problems unter Kollinearität. – Javad

+0

Nur eine Idee: Sehen Sie sich das Modul [cvxopt] (http://cvxopt.org/) an. – Thomas

Antwort

3

Dies ist, wie kann es mit GLM erfolgen:

import statsmodels 
import statsmodels.api as sm 
import numpy as np 

# Set the link function to identity 
statsmodels.genmod.families.links.identity() 

OLS_from_GLM = sm.GLM(y, sm.add_constant(np.column_stack(x, z))) 

'''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.''' 

res_OLS_from_GLM = OLS_from_GLM.fit_constrained(([0, 1.0, -1.0], 1)) 

print(res_OLS_from_GLM.summary()) 
+0

Der Aufruf der 'links.identity()' macht nichts. Die Auswahl eines Links müsste durch ein Argument in 'GLM' erfolgen. Identität ist jedoch die Standardverbindung für Gauß und muss nicht angegeben werden. – user333700

+0

@ user333700 Aus dem 'statsmodels.genmod.families.links' Docstring: _Definiert die Link-Funktionen, die mit GLM und GEE families_ verwendet werden sollen. So scheint es, dass die Link-Funktion über diese Anweisung gesetzt werden kann. Es könnte eine Möglichkeit sein, sie durch ein Argument im GLM-Aufruf zu setzen, aber ich konnte nichts darüber finden. Wie bereits erwähnt, ist Identität der Standard der Link-Funktion. – Javad

+0

Ja, das erstellt eine Verknüpfungsinstanz, die jedoch im Modell verwendet werden muss, um dem Modell als Argument bereitgestellt zu werden. Eine einzelne Anweisung wie diese könnte nur dann Auswirkungen haben, wenn sie einige globale Variablen ändern würde. Statsmodels verwendet jedoch keine globalen Variablen, da es sehr einfach wäre, unerwartete Ergebnisse zu erhalten, wenn irgendwo etwas geändert wird. – user333700