在Statsmodel公式API中使用变量代替列名



我有一个变量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,同时一次取两个因子来创建模型。

相关内容

  • 没有找到相关文章

最新更新