2015-08-13 16 views
6

ich die folgende lineare Regression haben:Python Statistiken Modelle - quadratische Term in Regression

import statsmodels.formula.api as sm 

model = sm.ols(formula = 'a ~ b + c', data = data).fit() 

Ich möchte in diesem Modell einen quadratischen Term für b hinzuzufügen.

Gibt es einen einfachen Weg, dies mit statsmodels.ols zu tun? Gibt es ein besseres Paket, das ich verwenden sollte, um dies zu erreichen?

Antwort

11

Obwohl die Lösung von Alexander arbeitet, in manchen Situationen ist es nicht sehr bequem ist. Zum Beispiel müssen Sie jedes Mal, wenn Sie das Ergebnis des Modells für neue Werte vorhersagen möchten, daran denken, sowohl b ** 2 als auch b-Werte zu übergeben, was umständlich ist und nicht notwendig sein sollte. Obwohl Patsy die Notation "b ** 2" nicht erkennt, erkennt es doch numpige Funktionen. So können Sie

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

data = {"a":[2, 3, 5], "b":[2, 3, 5], "c":[2, 3, 5]} 
model = sm.ols(formula = 'a ~ np.power(b, 2) + b + c', data = data).fit() 

Auf diese Weise verwenden, letztere können Sie dieses Modell wieder verwenden, ohne die Notwendigkeit, einen Wert für b angeben ** 2

model.predict({"a":[1, 2], "b":[5, 2], "c":[2, 4]}) 
1

sollte diese Arbeit:

data['b2'] = data.b ** 2 
model = sm.ols(formula = 'a ~ b2 + b + c', data=data).fit() 
+0

wissen Sie, ob dies von einer bestimmten Version abhängt? für mich wird der b ** 2 Term einfach übersprungen – datavoredan

+0

upgedated statsmodels auf 0.6.1 und immer noch nicht gut – datavoredan

+0

Das Erstellen einer Design-Matrix aus den Formeln wird von patsy gemacht und wird unabhängig von der statsmodels-Version sein. (Ich weiß nicht, wie Patsy die Power-Operation in einer Formel behandelt.) – user333700

8

Der einfachste Weg ist

model = sm.ols(formula = 'a ~ b + c + I(b**2)', data = data).fit() 

Die I(...) sagt im Grunde "Patsy, bitte hör auf clever zu sein hier und lass Python alles in kthx behandeln". (More detailed explanation)