Ejecutar análisis de regresión en múltiples subconjuntos de columnas pandas de manera eficiente

Podría haber optado por una pregunta más corta que solo se enfoca en el problema central aquí, que es la lista de permutaciones . Pero la razón por la que traigo estadísticas modelos y pandas a la pregunta es que pueden existir herramientas específicas para la regresión paso a paso que, al mismo tiempo, tiene la flexibilidad de almacenar la salida de regresión deseada, como estoy a punto de mostrarle a continuación, pero que son mucho mas eficientes Por lo menos eso espero.


Dado un dataframe como el siguiente:

Fragmento de código 1:

# Imports import pandas as pd import numpy as np import itertools import statsmodels.api as sm # A datafrane with random numbers np.random.seed(123) rows = 12 listVars= ['y','x1', 'x2', 'x3'] rng = pd.date_range('1/1/2017', periods=rows, freq='D') df_1 = pd.DataFrame(np.random.randint(100,150,size=(rows, len(listVars))), columns=listVars) df_1 = df_1.set_index(rng) print(df_1) 

Captura de pantalla 1:

introduzca la descripción de la imagen aquí

Me gustaría ejecutar varios análisis de regresión en la variable dependiente y utilizando múltiples combinaciones de las variables independientes x1, x2 y x3. En otras palabras, este es un análisis de regresión paso a paso donde y se prueba contra x1, y luego x2 y x3 en consecuencia. Entonces y se compara con el conjunto de x1 Y x2, y así sucesivamente:

  1. [‘y’, [‘x1’]]
  2. [‘y’, [‘x2’]]
  3. [‘y’, [‘x3’]]
  4. [‘y’, [‘x1’, ‘x2’]]
  5. [‘y’, [‘x1’, ‘x2’, ‘x3’]]

Mi enfoque ineficiente:

En los dos primeros fragmentos de código, puedo hacer exactamente esto codificando la secuencia de ejecución utilizando una lista de listas.

Aquí están los subconjuntos de listVars:

Fragmento de código 2:

 listExec = [[listVars[0], listVars[1:2]], [listVars[0], listVars[2:3]], [listVars[0], listVars[3:4]], [listVars[0], listVars[1:3]], [listVars[0], listVars[1:4]]] for l in listExec: print(l) 

Captura de pantalla 2:

introduzca la descripción de la imagen aquí

Con listExec puedo configurar un procedimiento para el análisis de regresión y almacenar un montón de resultados (rsquared o el modo de salida de todo el modelo.summary ()) en una lista como esta:

Fragmento de código 3:

 allResults = [] for l in listExec: x = listVars[1] x = sm.add_constant(df_1[l[1]]) model = sm.OLS(df_1[l[0]], x).fit() result = model.rsquared allResults.append(result) 

imprimir (todos los resultados)

Captura de pantalla 3:

introduzca la descripción de la imagen aquí

Y esto es bastante impresionante, pero horriblemente ineficiente para listas más largas de variables.

Mi bash de combinaciones de lista:

Siguiendo las sugerencias de Cómo generar todas las permutaciones de una lista en Python y Convertir una lista de tuplas en una lista de listas, puedo configurar una combinación de TODAS las variables como esta:

Fragmento de código 4:

 allTuples = list(itertools.permutations(listVars)) allCombos = [list(elem) for elem in allTuples] 

Captura de pantalla 4:

introduzca la descripción de la imagen aquí

Y eso es muy divertido, pero no me da el enfoque gradual que estoy buscando. De todos modos, espero que algunos de ustedes encuentren esto interesante.

Gracias por cualquier sugerencia!

Basándome en la ayuda que obtuve aquí , he podido armar una función que toma todas las columnas en un dataframe de pandas, define una variable dependiente y devuelve todas las combinaciones únicas de las variables restantes. El resultado difiere un poco del resultado deseado como se definió anteriormente, pero creo que tiene más sentido para el uso práctico. Todavía espero que otros puedan publicar soluciones aún mejores.

Aquí está:

 # Imports import pandas as pd import numpy as np import itertools # A datafrane with random numbers np.random.seed(123) rows = 12 listVars= ['y','x1', 'x2', 'x3'] rng = pd.date_range('1/1/2017', periods=rows, freq='D') df_1 = pd.DataFrame(np.random.randint(100,150,size=(rows, len(listVars))), columns=listVars) df_1 = df_1.set_index(rng) # The function def StepWise(columns, dependent): """ Takes the columns of a pandas dataframe, defines a dependent variable and returns all unique combinations of the remaining (independent) variables. """ independent = columns.copy() independent.remove(dependent) lst1 = [] lst2 = [] for i in np.arange(1, len(independent)+1): #print(list(itertools.combinations(independent, i))) elem = list(itertools.combinations(independent, i)) lst1.append(elem) lst2.extend(elem) combosIndependent = [list(elem) for elem in lst2] combosAll = [[dependent, other] for other in combosIndependent] return(combosAll) lExec = StepWise(columns = list(df_1), dependent = 'y') print(lExec) 

introduzca la descripción de la imagen aquí

Si combina esto con el fragmento de código 3 anterior, puede almacenar fácilmente los resultados de múltiples análisis de regresión en una variable dependiente específica en un dataframe de pandas.