Statsmodels:ols 编写具有未知列名的公式

Statsmodels: ols writing Formula with unknown column names

我正在尝试使用 statsmodels 运行 ANOVA,为此我正在为我的数据框中的每一列(分类特征)制作模型 wrt 到一列 'imp' 如下在一个循环中。

for cat_feature in df:
  data_model = pd.DataFrame({
    'x': df[cat_feature],
    'y': df['imp']})
  model = smf.ols('y ~ x',data=data_model).fit()
  res = sm.stats.anova_lm(model, typ=1)

但我想做的是:

smf.ols(df['imp'] ~ df[cat_feature],data=df).fit()

但这不是正确的语法。

而不必每次都使 data_model 的其中一列始终相同。

可能吗?

或者简单地说

model = smf.ols('A~B', data=df).fit()

有效但

model2 = smf.ols(df.A ~ df.B, data=df).fit()

没有。

公式界面,小写 ols 与大写 OLS 相比,需要一个公式字符串作为第一个参数。

所以,我想你想要字符串连接

smf.ols('imp ~' + cat_feature, data=df).fit()

指定 pandas 系列和 DataFrame 或 numpy 数组仅适用于主要 class OLS

import statsmodels.api as sm
model2 = sm.OLS(df['imp'], df[cat_feature]).fit()

作为背景信息:

OLS为实际型号class
formula.api 中的 ols 只是 OLS.from_formula 方法的一个方便的别名,它在创建 OLS 实例之前预处理公式信息。

字符~是公式字符串的必需元素,但在常规python classes、方法或函数中分隔参数是无效的。

array/dataframe 和公式界面之间的一个重要区别:

数组接口,即像
中那样使用OLS sm.OLS(df['imp'], df[cat_feature])
不对数据进行任何预处理,即 exog 按原样使用。具体来说,没有添加常量,并且分类特征没有以某些数字虚拟或对比表示形式进行编码。

公式界面使用 patsy 预处理数据,在很大程度上与 R 的公式相同。这意味着默认情况下会添加一个常量,并且任何 non-numeric 列(如包含字符串的列)都是作为分类变量或因子变量的过程。