Python 3.x 如何在不循环的情况下获得Stats模型中多个单变量OLS的变量t-stat?

Python 3.x 如何在不循环的情况下获得Stats模型中多个单变量OLS的变量t-stat?,python-3.x,performance,statsmodels,Python 3.x,Performance,Statsmodels,下面的代码用于获取我运行的OLS的t-stats和r-squared。然而,我有数以百万计的回归运行和循环,这是我的年龄。如果建议其他解决方案,我们将不胜感激。谢谢 import statsmodels.api as sm import pandas as pd import numpy as np x = np.cumsum(np.ones(5)) df_y = pd.DataFrame({"A": [10,20,30,40,50],

下面的代码用于获取我运行的OLS的t-stats和r-squared。然而,我有数以百万计的回归运行和循环,这是我的年龄。如果建议其他解决方案,我们将不胜感激。谢谢

import statsmodels.api as sm
import pandas as pd
import numpy as np

x = np.cumsum(np.ones(5))
df_y = pd.DataFrame({"A": [10,20,30,40,50], 
                   "B": [20, 30, 10, 40, 50], 
                   "C": [32, 234, 23, 23, 42523]})
df_result = pd.DataFrame({"t-stats": np.ones(3)*np.nan, 
                          "r2": np.ones(3)*np.nan})
for i in range(0,df_y.shape[1]):
    y = df_y.iloc[:,i]
    results = sm.OLS(y,x).fit()
    df_result.loc[i, "t-stats"] = (results.params/results.bse).values
    df_result.loc[i, "r2"] = results.rsquared
对不起,补充我的问题


如果y中缺少值怎么办?如何处理?谢谢

不幸的是,您无法使用statsmodels执行此操作,因为y必须是单个变量。如果您确实需要这里的性能,您可以使用numpy轻松编写自己的版本。假设
x
从未改变

import numpy as np
import pandas as pd
import statsmodels.api as sm

# Assume y is n by m where m is 1,000,000, use 1,000 here for speed
y = pd.DataFrame(np.random.standard_normal((20,1000)))
x = pd.DataFrame(sm.add_constant(np.random.standard_normal((20,3))))
_x = np.asarray(x)
_y = np.asarray(y)
b = np.linalg.lstsq(_x, _y, rcond=None)[0]
e = _y - _x @ b
err_var = (e**2).mean(0)
# correct formula depends if x has a constant, here I assume it does
r2 = 1.0 - err_var / ((_y - _y.mean(0))**2).mean(0)
xpxi = np.linalg.inv(_x.T@_x)
se = np.sqrt(np.diag(xpxi)[:,None]*err_var)
tstats = b / se
与使用statsmodels相比,这种方法的鲁棒性较差,但会精确地快一个数量级,因为它避免了大量检查、边缘案例保护和计算您不想要的统计数据


在我的机器上,此代码运行时间为1.9ms,因此对于1000000系列,大约需要2秒。

感谢Kevin提供的解决方案。在我的例子中,y和x都是一个单变量和一个常量。如果y中缺少值呢?如何处理?谢谢,在运行代码之前,您通常需要从y和x中删除这些值。因此,这不能以上述方式完成,因为每个y中缺少的值位于不同的位置……这是正确的。当缺少值时,需要选择y和x的正确子集以获得正确的结果,因此需要在每个数据集中运行模型。