【问题标题】:Is pd.get_dummies the same as simply including categorical variable in statsmodel ols?pd.get_dummies 是否与仅在 statsmodel ols 中包含分类变量相同?
【发布时间】:2021-04-06 09:23:56
【问题描述】:

我有来自如下实验的面板数据:

account usage yearmonth pre/post group
1 121 oct 2019 pre control
1 124 Nov 2019 post control
2 120 oct 2019 pre treatment
2 118 nov 2019 post treatment

在我的数据中,我有大约 50 个月和更多的帐户。

我正在使用 statsmodel 公式/patsy 运行 ols 来评估结果。

这不是我正在使用的确切模型规范,但为了这个问题:

smf.ols("usage ~ C(group, Treatment('control'))* C(pre/post, Treatment(pre)) + yearmonth), df).fit()

我的问题是,当我在公式中包含“yearmonth”变量时,statsmodel 是否将其视为虚拟变量,还是需要先对其使用 pd.get_dummies 然后再使用此模型:

 smf.ols("usage ~ C(group, Treatment('control'))* C(pre/post, Treatment(pre)) + oct 2019 + nov 2019), df).fit()

如果我使用后者,我的公式将会非常长。那我需要这样做吗?

谢谢!

【问题讨论】:

    标签: python linear-regression statsmodels dummy-variable panel-data


    【解决方案1】:

    get_dummies 为每个分类值创建一个列。您将结果连接到数据框中并删除类别列。 get_dummies 允许分类排名。而 df['category'].astype(category) 没有。您可以使用 labelEncoder 设置唯一且不需要排名的类别,如男性和女性。

    【讨论】:

      【解决方案2】:

      如果列是文本列,我相信默认的分类编码是Treatment。在这种情况下,Treatement 返回K-1 类别,这样您的yearmonth 值之一将被视为基线,您将看到除该日期之外的所有其他日期的系数。这个可以详细看here.

      pd.get_dummies 默认情况下不会这样操作。它将为每个分类值创建列,这意味着您将使用此方法获得一个额外的列。

      如果您希望使用pd.get_dummies,则需要设置drop_first=True 参数。你可以找到文档here

      简而言之,第一种方法没有任何问题,因为它实际上是在幕后制作傻瓜,值得注意的是它是 K-1,而不是 K 类别。

      【讨论】:

      • 感谢您的明确解释。这完全有道理。我想我的后续问题是,有没有一种方法可以让我获得 K 个类别,而不必输入 pd.get_dummies 生成的每一列?
      • 他们将在摘要中打印出来
      • 对不起,克里斯,我的问题不是很清楚。我的问题是,一旦我使用了 pd.get_dummies,它会在我的 df 中生成大约 40 个新列。如果我想将这 40 列包含到我的 statsmodel 公式中,我将不得不花费大量时间输入每个列标题(月)。有没有更快的方法将 pd.get_dummies 生成的所有这些月份包含到 statsmodel 公式中?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 2023-04-08
      • 2018-12-28
      • 2019-04-14
      相关资源
      最近更新 更多