2015-08-13 14 views
6

Ho la seguente regressione lineare:Statistiche python modelli - termine quadratico in regressione

import statsmodels.formula.api as sm 

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

voglio aggiungere un termine quadratico per b in questo modello.

C'è un modo semplice per farlo con statsmodels.ols? Esiste un pacchetto migliore che dovrei usare per raggiungere questo obiettivo?

risposta

11

Anche se la soluzione da Alexander sta lavorando, in alcune situazioni non è molto conveniente. Ad esempio, ogni volta che si desidera predire il risultato del modello per nuovi valori, è necessario ricordare di passare entrambi i valori b ** 2 e b che è macchinoso e non dovrebbe essere necessario. Sebbene patsy non riconosca la notazione "b ** 2", riconosce le funzioni numpy. Così, è possibile utilizzare

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() 

In questo modo, quest'ultimo, è possibile riutilizzare questo modello, senza la necessità di specificare un valore per B ** 2

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

questo dovrebbe funzionare:

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

sai se questo dipende da una determinata versione? per me il termine b ** 2 è appena saltato – datavoredan

+0

statsmodels aggiornati a 0.6.1 e ancora non va bene – datavoredan

+0

Creare una matrice di design dalle formule è fatto da patsy e sarà indipendente dalla versione statsmodels. (Non so come patsy tratta l'operazione di potere in una formula.) – user333700

8

Il modo più semplice è

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

Il I(...) dice fondamentalmente "patsy, per favore smetti di essere intelligente qui e lascia che Python gestisca tutto all'interno di kthx". (More detailed explanation)