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

3

我正在尝试使用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()

但这不是正确的语法。

不必每次都创建数据模型,其中一个列始终相同。

有可能吗?

或者简单地说

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

能够正常工作但是

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

不可以。


df[cat_feature] 中的值是数字还是字符串或其他类型? - Josef
字符串。model2 = smf.ols('df.A ~ df.B', data=df).fit() 能够正常工作。因为名称对我来说并不重要。 - julian joseph
1个回答

6
公式接口(小写的ols,与大写的OLS相对),需要一个公式字符串作为第一个参数。
所以,我认为您需要字符串连接。
smf.ols('imp ~' + cat_feature, data=df).fit()

在指定pandas系列、DataFrames或numpy数组时,只能使用主类OLS

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

作为背景信息: OLS 是实际的模型类,
来自公式.api 的 ols 只是方法 OLS.from_formula 的一个方便的别名,它在创建 OLS 实例之前预处理公式信息。
字符 ~ 是公式字符串的必需元素,但在常规 Python 类、方法或函数中分隔参数是无效的。
数组/数据框架和公式接口之间的一个关键区别是:
数组接口,即像下面这样使用 OLS:
sm.OLS(df['imp'], df[cat_feature])
不对数据进行任何预处理,即 exog 按原样采取。具体而言,没有添加常量且分类特征未编码为某些数字虚拟或对比表示形式。
公式接口使用 patsy 预处理数据,大部分与 R 的公式相同。这意味着默认情况下会添加常量,并且任何非数字列(例如包含字符串的列)都将被处理为分类或因子变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接