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

jul*_*eph 3 python syntax anova statsmodels

我正在尝试使用 statsmodels 运行方差分析,为此我在循环中为数据框中的每一列(分类特征)制作模型到一列“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)
Run Code Online (Sandbox Code Playgroud)

但我想做的是这样的:

smf.ols(df['imp'] ~ df[cat_feature],data=df).fit()
Run Code Online (Sandbox Code Playgroud)

但这不是正确的语法。

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

是否可以?

或者简单地说

model = smf.ols('A~B', data=df).fit()
Run Code Online (Sandbox Code Playgroud)

有效但是

model2 = smf.ols(df.A ~ df.B, data=df).fit()
Run Code Online (Sandbox Code Playgroud)

没有。

Jos*_*sef 6

公式接口(小写ols与大写相反OLS)需要公式字符串作为第一个参数。

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

smf.ols('imp ~' + cat_feature, data=df).fit()
Run Code Online (Sandbox Code Playgroud)

指定 pandas Series 和 DataFrames 或 numpy 数组仅适用于主类OLS

import statsmodels.api as sm
model2 = sm.OLS(df['imp'], df[cat_feature]).fit()
Run Code Online (Sandbox Code Playgroud)

作为背景信息:

OLS是来自 Formula.api 的实际模型类,它只是在创建实例之前预处理公式信息的
ols方法的方便别名。OLS.from_formulaOLS

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

数组/数据框和公式接口之间的一个关键区别:

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

公式接口用于patsy预处理数据,大部分与 R 的公式相同。这意味着默认情况下会添加一个常量,并且任何非数字列(例如包含字符串的列)都会作为分类变量或因子变量进行处理。