有效地对多个pandas列子集运行回归分析

时间:2018-02-05 13:49:42

标签: python list pandas regression

我本来可以选择一个较短的问题,只关注核心问题,即列表排列。但我将 statsmodels pandas 纳入问题的原因是,可能存在逐步回归的特定工具,同时具有以下的灵活性:存储所需的回归输出,就像我将要在下面显示,但效率更高。至少我希望如此。

给出如下数据框:

代码段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:

enter image description here

我想使用自变量x1,x2和x3的多个组合对因变量y运行几个回归分析。换句话说,这是逐步回归分析,其中y针对x1进行测试,然后针对x2和x3进行测试。然后根据x1和x2的集合测试y,依此类推:

  1. [' y',[' x1']]
  2. [' y',[' x2']]
  3. [' y',[' x3']]
  4. [' y',[' x1',' x2']]
  5. [' y',[' x1',' x2',' x3']]
  6. 我的低效方法:

    在下面的第一个片段中,我可以通过使用列表列表对执行序列进行硬编码来完成此操作。

    以下是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:

    enter image description here

    使用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:

    enter image description here

    这非常棒,但对于较长的变量列表来说效率非常低。

    我尝试列表组合:

    遵循How to generate all permutations of a list in PythonConvert a list of tuples to a list of lists的建议  我可以设置所有变量的组合,如下所示:

    代码段4:

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

    屏幕截图4:

    enter image description here

    这很有趣,但并没有给我以后的逐步方法。无论如何,我希望你们中的一些人觉得这很有意思。

    感谢您的任何建议!

1 个答案:

答案 0 :(得分:1)

根据我得到here的帮助,我已经能够将一个函数放在一起,该函数获取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)

enter image description here

如果将其与上面的代码段3 结合使用,则可以轻松地将多个回归分析的结果存储在pandas数据框中的指定因变量上。