下面的代码用于获得OLS I运行的t-状态和r-平方。然而,我有数百万的回归要运行,通过循环,这需要我很长时间。如有其他解决方案建议,不胜感激。谢谢
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中缺少值怎么办?如何处理?感谢
不幸的是,由于y必须是一个单独的变量,因此无法使用statsmodel来完成此操作。如果您真的需要这里的性能,您可以使用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
这种方法的健壮性不如使用统计模型,但速度会快一个数量级,因为它避免了大量检查、边缘案例保护和计算你不想要的统计数据。
在我的机器上,这段代码运行时间为1.9ms,所以对于1000000系列,大约需要2秒。