我本来可以选择一个较短的问题,只关注核心问题,即列表排列。但我将 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:
我想使用自变量x1,x2和x3的多个组合对因变量y运行几个回归分析。换句话说,这是逐步回归分析,其中y针对x1进行测试,然后针对x2和x3进行测试。然后根据x1和x2的集合测试y,依此类推:
我的低效方法:
在下面的第一个片段中,我可以通过使用列表列表对执行序列进行硬编码来完成此操作。
以下是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:
这非常棒,但对于较长的变量列表来说效率非常低。
我尝试列表组合:
遵循How to generate all permutations of a list in Python和Convert a list of tuples to a list of lists的建议 我可以设置所有变量的组合,如下所示:
代码段4:
allTuples = list(itertools.permutations(listVars))
allCombos = [list(elem) for elem in allTuples]
屏幕截图4:
这很有趣,但并没有给我以后的逐步方法。无论如何,我希望你们中的一些人觉得这很有意思。
感谢您的任何建议!
答案 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)
如果将其与上面的代码段3 结合使用,则可以轻松地将多个回归分析的结果存储在pandas数据框中的指定因变量上。