如何在不循环的情况下获取statsmodels中多个单变量OLS的变量t-stat?
How to get the variable t-stat of multiple univariate OLS in statsmodels without looping?
下面的代码用于获取 OLS I 运行 的 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.9 毫秒,因此对于 1,000,000 个系列,大约需要 2 秒。
下面的代码用于获取 OLS I 运行 的 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.9 毫秒,因此对于 1,000,000 个系列,大约需要 2 秒。