【问题标题】:Run regression analysis on multiple subsets of pandas columns efficiently高效地对 pandas 列的多个子集运行回归分析
【发布时间】:2018-07-15 09:32:50
【问题描述】:

我本可以选择一个较短的问题,只关注这里的核心问题,即列表排列。但我将 statsmodelspandas 带入问题的原因是,可能存在用于逐步回归的特定工具,同时具有存储所需的回归输出,就像我将在下面向您展示的那样,但效率更高。至少我希望如此。


给定如下数据框:

代码 sn-p 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:

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

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

我的低效方法:

在下面的前两个 sn-p 中,我可以通过使用列表列表硬编码执行序列来做到这一点。

这里是 listVars 的子集:

代码 sn-p 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())存储在这样的列表中:

代码 sn-p 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)

打印(所有结果)

屏幕截图 3:

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

我的列表组合尝试:

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

代码 sn-p 4:

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

屏幕截图 4:

这很有趣,但并没有给我我所追求的循序渐进的方法。无论如何,我希望你们中的一些人觉得这很有趣。

感谢您的任何建议!

【问题讨论】:

    标签: python list pandas regression


    【解决方案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)
    

    如果将其与上面的 sn-p 3 结合使用,您可以轻松地将对指定因变量的多元回归分析的结果存储在 pandas 数据框中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-14
      • 2021-11-05
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多