python OLS statsmodels T未输入模型的变量的统计

时间:2018-10-24 13:58:50

标签: python pandas regression statsmodels

您好使用Statsmodels创建了OLS回归

我已经编写了一些代码,该代码循环遍历数据框中的每个变量,然后将其输入模型,然后将T Stat记录在新的数据框中,并建立潜在变量的列表。

但是我有20,000个变量,因此每次运行都要花一些时间。

谁能想到更好的方法?

这是我目前的做法

TStatsOut=pd.DataFrame()

for i in VarsOut:
    try:
        xstrout='+'.join([baseterms,i])
        fout='ymod~'+xstrout
        modout = smf.ols(fout, data=df_train).fit()
        j=pd.DataFrame(modout.pvalues,index=[i],columns=['PValue'])
        k=pd.DataFrame(modout.params,index=[i],columns=['Coeff'])
        s=pd.concat([j, k], axis=1, join_axes=[j.index])
        TStatsOut=TStatsOut.append(s)

1 个答案:

答案 0 :(得分:0)

关于您的问题,这就是我所发现的。我的答案使用了var1: '"fred"' var2: '"barney"' var3: '"wilma"' 进行分布式计算的方法,并且只是对当前方法进行了一般性的清理。

我制作了一个较小的伪数据集,其中包含1000个变量,一个将是结果,而两个将是dask,因此实际上有997个变量可以循环。

baseterms

当前代码的基准(20s +-858ms):

import dask
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf

#make some toy data for the case you showed
df_train = pd.DataFrame(np.random.randint(low=0,high=10,size=(10000, 1000)))
df_train.columns = ['var'+str(x) for x in df_train.columns]
baseterms = 'var1+var2'
VarsOut = df_train.columns[3:]

为提高可读性创建了一个函数,但仅返回了pval和每个测试的变量而不是一行数据帧的回归系数。

%%timeit
TStatsOut=pd.DataFrame()

for i in VarsOut:
xstrout='+'.join([baseterms,i])
fout='var0~'+xstrout
modout = smf.ols(fout, data=df_train).fit()
j=pd.DataFrame(modout.pvalues,index=[i],columns=['PValue'])
k=pd.DataFrame(modout.params,index=[i],columns=['Coeff'])
s=pd.concat([j, k], axis=1, join_axes=[j.index])
TStatsOut=TStatsOut.append(s)

现在运行时间为(14.1s +-982ms)

def testVar(i):
    xstrout='+'.join([baseterms,i])
    fout='var0~'+xstrout
    modout = smf.ols(fout, data=df_train).fit()
    pval=modout.pvalues[i]
    coef=modout.params[i]
    return pval, coef

使用Dask延迟进行并行处理。请记住,创建的每个延迟任务也会造成轻微的开销,因此有时它可能没有好处,但将取决于您的确切数据集以及回归所需的时间。我的数据示例可能太简单了,无法显示出任何好处。

%%timeit
pvals=[]
coefs=[]

for i in VarsOut:
    pval, coef = testVar(i)
    pvals.append(pval)
    coefs.append(coef)

TStatsOut = pd.DataFrame(data={'PValue':pvals, 'Coeff':coefs},
                         index=VarsOut)[['PValue','Coeff']]

现在运行997个候选变量,并创建一个延迟了dask的相同数据框。 (18.6s +-588ms)

#define the same function as before, but tell dask how many outputs it has
@dask.delayed(nout=2)
def testVar(i):
    xstrout='+'.join([baseterms,i])
    fout='var0~'+xstrout
    modout = smf.ols(fout, data=df_train).fit()
    pval=modout.pvalues[i]
    coef=modout.params[i]
    return pval, coef

同样,迟钝的延迟会创建更多的开销,因为它将创建要在许多处理器之间发送的任务,因此,性能的提高将取决于数据实际进行回归的时间以及可用的CPU数量。 Dask可以从单个工作站扩展到一组工作站。