2015-10-21 28 views
6

Mi piacerebbe stimare un modello di regressione IV utilizzando molte interazioni con dummy annuali, demografici, ecc. Non riesco a trovare un metodo esplicito per farlo in Panda e sono curioso di sapere se qualcuno ha dei suggerimenti.Come generare molti termini di interazione in Panda?

Sto pensando di provare scikit-learn e questa funzione:

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html

+3

utilizzare le formule di patsy http://statsmodels.sourceforge.net/devel/examples/notebooks/generated/formulas.html – user333700

+0

Ho aggiunto un collegamento a Wikipedia per spiegare l'abbreviazione IV – Wolf

+0

BTW: statsmodels ha IV (IV2SLS e IVGMM nella sandbox) – user333700

risposta

2

È possibile utilizzare la funzione di PolynomialFeatures sklearn. Ecco un esempio:

Ipotizziamo, questo è il vostro disegno (cioè caratteristica) matrice:

x = array([[ 3, 20, 11], 
     [ 6, 2, 7], 
     [18, 2, 17], 
     [11, 12, 19], 
     [ 7, 20, 6]]) 


x_t = PolynomialFeatures(2, interaction_only=True, include_bias=False).fit_transform(x) 

Ecco il risultato:

array([[ 3., 20., 11., 60., 33., 220.], 
     [ 6., 2., 7., 12., 42., 14.], 
     [ 18., 2., 17., 36., 306., 34.], 
     [ 11., 12., 19., 132., 209., 228.], 
     [ 7., 20., 6., 140., 42., 120.]]) 

I primi 3 caratteristiche sono le caratteristiche originali, e le tre successive sono interazioni delle funzionalità originali.

3

Ora mi trovavo di fronte a un problema simile, in cui avevo bisogno di un modo flessibile per creare interazioni specifiche e ho guardato attraverso StackOverflow. Ho seguito il suggerimento nel commento sopra di @ user333700 e grazie a lui trovato patsy (http://patsy.readthedocs.io/en/latest/overview.html) e dopo una ricerca su Google questo scikit-imparare l'integrazione patsylearn (https://github.com/amueller/patsylearn).

Quindi passare attraverso l'esempio di @ motam79, questo è possibile:

import numpy as np 
import pandas as pd 
from patsylearn import PatsyModel, PatsyTransformer 
x = np.array([[ 3, 20, 11], 
    [ 6, 2, 7], 
    [18, 2, 17], 
    [11, 12, 19], 
    [ 7, 20, 6]]) 
df = pd.DataFrame(x, columns=["a", "b", "c"]) 
x_t = PatsyTransformer("a:b + a:c + b:c", return_type="dataframe").fit_transform(df) 

Questo restituisce il seguente:

 a:b a:c b:c 
0 60.0 33.0 220.0 
1 12.0 42.0 14.0 
2 36.0 306.0 34.0 
3 132.0 209.0 228.0 
4 140.0 42.0 120.0 

ho risposto a una domanda simile qui, dove fornisco un altro esempio con variabili categoriali: How can an interaction design matrix be created from categorical variables?