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

时间:2018-03-28 05:55:46

标签: python syntax statsmodels anova

我正在尝试使用statsmodels运行ANOVA,我正在为我的数据框中的每一列(分类特征)创建模型,以及一列' 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()

没有按'吨。

1 个答案:

答案 0 :(得分:2)

公式接口,小写ols与大写OLS形成对比,需要公式字符串作为第一个参数。

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

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

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

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

作为背景资料:

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

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

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

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

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