Statsmodel Formula API中如何用变量替代列名构造回归公式
问题场景
你持有存储了目标数据表列名列表的变量cols,需要遍历列表内的不同列,对数据表批量执行回归分析。使用Statsmodel Formula API(Patsy)构造公式时,初始编写的代码如下:
model = smf.ols(formula="Annual_Sales ~ Q('cols')", data=df).fit()
这段代码运行报错的核心原因是公式中直接传入了字符串字面量cols,对应的数据表中不存在名为cols的字段。由于待分析列共150个,无法手动逐一输入列名,需要优先通过for循环实现批量回归逻辑。
可行实现方案
核心逻辑是遍历cols列表时,动态拼接每个列名生成符合Patsy解析规则的公式字符串,再逐个传入模型完成拟合。
- 单变量批量一元回归
如果你的需求是每个自变量单独和因变量Annual_Sales做一元线性回归,直接用f-string动态拼接公式即可。对包含空格、特殊符号、数字开头等不符合Python变量名规则的列名,用Q()包裹做转义,避免公式解析报错:
import statsmodels.formula.api as smf # 存储所有拟合完成的模型,键为对应列名,值为模型拟合结果 model_dict = {} for col in cols: # 动态拼接当前列对应的回归公式 current_formula = f"Annual_Sales ~ Q('{col}')" fitted_model = smf.ols(formula=current_formula, data=df).fit() model_dict[col] = fitted_model # 按需提取回归结果,比如遍历输出所有模型的摘要 for col_name, model_res in model_dict.items(): print(f"===== 自变量【{col_name}】回归结果 =====") print(model_res.summary())
- 全变量多元回归
如果你的需求是把cols内的所有列同时作为自变量,拟合一个多元线性回归模型,不需要写循环,直接把所有列名拼接为公式右侧的字符串即可:
# 拼接所有自变量,用+连接,Q()处理特殊列名 formula_rhs = " + ".join([f"Q('{col}')" for col in cols]) full_formula = f"Annual_Sales ~ {formula_rhs}" full_model = smf.ols(formula=full_formula, data=df).fit() print(full_model.summary())
提示:如果你的列名全部是合法Python变量名(无空格、无特殊符号、非数字开头),可以省略
Q()包裹逻辑,直接拼接列名即可,公式写法更简洁。
内容的提问来源于stack exchange,提问作者Bhavya Budhia
相关产品推荐
相关产品推荐

