Эффективно выполнять регрессионный анализ нескольких подмножеств столбцов панд

Я мог бы выбрать более короткий вопрос, который фокусируется только на основной проблеме здесь, а именно на перестановках списков. Но причина, по которой я привожу статистические модели и панды в вопрос, заключается в том, что могут существовать специальные инструменты для пошаговой регрессии, которые в то же время обладают гибкостью для сохранения желаемого результата регрессии, как я собираюсь показать вам ниже, но это гораздо эффективнее. По крайней мере, я на это надеюсь.


Учитывая данные, как показано ниже:

Фрагмент кода 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)

Снимок экрана 1:

Я хотел бы запустить несколько регрессионных анализов для зависимой переменной y, используя несколько комбинаций независимых переменных x1, x2 и x3. Другими словами, это пошаговый регрессионный анализ, где y проверяется по x1, а затем x2 и x3 последовательно. Затем y проверяется на соответствие x1 и x2, и так далее:

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

Мой неэффективный подход:

В двух первых фрагментах, приведенных ниже, я могу сделать именно это путем жесткого кодирования последовательности выполнения с использованием списка списков.

Вот подмножества listVars:

Фрагмент кода 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)

Снимок экрана 2:

С помощью listExec я могу настроить процедуру регрессионного анализа и сохранить несколько результатов (rsquared или всю модель вывода mode.summary()) в виде списка:

Фрагмент кода 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)

печать (allResults)

Снимок экрана 3:

И это довольно круто, но ужасно неэффективно для длинных списков переменных.

Моя попытка составления списка:

Следуя советам из Как создать все перестановки списка в Python и Преобразовать список кортежей в список списков, я могу установить комбинацию ВСЕХ переменных, как это:

Фрагмент кода 4:

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

Снимок экрана 4:

И это очень весело, но не дает мне поэтапного подхода, к которому я стремлюсь. В любом случае, я надеюсь, что некоторые из вас найдут это интересным.

Спасибо за любые предложения!

1 ответ

Решение

Основываясь на помощи, которую я получил, я смог собрать функцию, которая собирает все столбцы в фрейме данных pandas, определяет зависимую переменную и возвращает все уникальные комбинации оставшихся переменных. Результат немного отличается от желаемого результата, как определено выше, но, я думаю, имеет больше смысла для практического использования. Я все еще надеюсь, что другие смогут публиковать еще лучшие решения.

Вот:

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

Если вы объедините это с фрагментом 3 выше, вы можете легко сохранить результаты множественного регрессионного анализа для указанной зависимой переменной во фрейме данных pandas.

Другие вопросы по тегам