我有一个变量cols
,它包含我的表的列名列表。
现在我想通过循环cols
变量的不同列在我的表上运行回归。
我试图使用Statsmodel公式API (Patsy),但无法构建适当的公式
我现在正在尝试的代码是:
model = smf.ols(formula="Annual_Sales ~ Q('cols')", data=df).fit()
但这显然是不工作的cols不存在于我的df
表
任何建议我如何做到这一点,最好是通过for loop
,因为我有150列,我不能手动输入公式中的所有这些名称。
谢谢
您甚至不需要循环,因为您可以将该列表转换为字符串并将该字符串插入公式。下面是一个使用statsmodels
样本数据集的示例:
import statsmodels.api as sm
import statsmodels.formula.api as smf
df = sm.datasets.get_rdataset("Guerry", "HistData").data
df = df[['Lottery', 'Literacy', 'Wealth', 'Region']].dropna()
cols = ['Literacy', 'Wealth', 'Region'] # list of independent variables
cols_str = " + ".join(cols)
print(cols_str) # 'Literacy + Wealth + Region'
mod = smf.ols(formula=f"Lottery ~ {cols_str}", data=df)
print(mod.fit().summary())
# OLS Regression Results
# ==============================================================================
# Dep. Variable: Lottery R-squared: 0.338
# Model: OLS Adj. R-squared: 0.287
# Method: Least Squares F-statistic: 6.636
# Date: Tue, 28 Jun 2022 Prob (F-statistic): 1.07e-05
# Time: 06:59:17 Log-Likelihood: -375.30
# No. Observations: 85 AIC: 764.6
# Df Residuals: 78 BIC: 781.7
# Df Model: 6
# Covariance Type: nonrobust
# ===============================================================================
# coef std err t P>|t| [0.025 0.975]
# -------------------------------------------------------------------------------
# Intercept 38.6517 9.456 4.087 0.000 19.826 57.478
# Region[T.E] -15.4278 9.727 -1.586 0.117 -34.793 3.938
# Region[T.N] -10.0170 9.260 -1.082 0.283 -28.453 8.419
# Region[T.S] -4.5483 7.279 -0.625 0.534 -19.039 9.943
# Region[T.W] -10.0913 7.196 -1.402 0.165 -24.418 4.235
# Literacy -0.1858 0.210 -0.886 0.378 -0.603 0.232
# Wealth 0.4515 0.103 4.390 0.000 0.247 0.656
# ==============================================================================
# Omnibus: 3.049 Durbin-Watson: 1.785
# Prob(Omnibus): 0.218 Jarque-Bera (JB): 2.694
# Skew: -0.340 Prob(JB): 0.260
# Kurtosis: 2.454 Cond. No. 371.
# ==============================================================================
# Warnings:
# [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
我能够解决这个问题的一种方法是使用字符串格式,因为通常在Statsmodel
内编写的公式是String
格式。
所以如果我们有
col = ["a", "b", "c", "d"]
我们可以写
for i in range(0, len(col) - 1):
for j in range(i + 1, len(col)):
model = smf.ols(formula="Annual_Sales ~ Q('{}') + ('{}')".format(col[i], col[j]), data=df).fit()
这将允许我们循环遍历列表变量col,同时一次取两个因子来创建模型。