Execute análise de regressão em vários subconjuntos de colunas pandas com eficiência

Eu poderia ter optado por uma pergunta mais curta, que se concentra apenas no problema principal aqui que élista de permutações. Mas a razão pela qual estou trazendostatsmodels epandas A questão é que podem existir ferramentas específicas para a regressão passo a passo que, ao mesmo tempo, têm a flexibilidade de armazenar a saída de regressão desejada, como vou mostrar a seguir, mas que são muito mais eficientes. Pelo menos eu espero que sim.

Dado um quadro de dados como abaixo:

Snippet 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 tela 1:

Eu gostaria de executar várias análises de regressão na variável dependente y usando várias combinações das variáveis independentes x1, x2 e x3. Em outras palavras, essa é uma análise de regressão passo a passo em que y é testado contra x1 e, em seguida, x2 e x3, consequentemente. Então y é testado contra o conjunto de x1 AND x2 e assim por diante:

['y', ['x1']]['y', ['x2']]['y', ['x3']]['y', ['x1', 'x2']]['y', ['x1', 'x2', 'x3']]

Minha abordagem ineficiente:

Nos dois primeiros trechos a seguir, sou capaz de fazer exatamente isso codificando a sequência de execução usando uma lista de listas.

Aqui estão os subconjuntos de listVars:

Snippet 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 tela 2:

Com listExec, posso configurar um procedimento para análise de regressão e obter vários resultados (rsquared ou o modo de saída do modelo inteiro.summary ()) em uma 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)

print (allResults)

Captura de tela 3:

E isso é bastante impressionante, mas terrivelmente ineficiente para listas mais longas de variáveis.

Minha tentativa de combinação de listas:

Seguindo as sugestões deComo gerar todas as permutações de uma lista em Python eConverter uma lista de tuplas em uma lista de listas Eu sou capaz de configurar uma combinação de todas as variáveis como esta:

Snippet de código 4:

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

Captura de tela 4:

E isso é muito divertido, mas não me dá a abordagem gradual que eu busco. Enfim, espero que alguns de vocês achem isso interessante.

Obrigado por todas as sugestões!

questionAnswers(1)

yourAnswerToTheQuestion