【发布时间】:2018-07-15 09:32:50
【问题描述】:
我本可以选择一个较短的问题,只关注这里的核心问题,即列表排列。但我将 statsmodels 和 pandas 带入问题的原因是,可能存在用于逐步回归的特定工具,同时具有存储所需的回归输出,就像我将在下面向您展示的那样,但效率更高。至少我希望如此。
给定如下数据框:
代码 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 进行测试,依此类推:
- ['y', ['x1']]
- ['y', ['x2']]
- ['y', ['x3']]
- ['y', ['x1', 'x2']]
- ['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 Python 和Convert 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