Statsmodels 从公式生成分类数据(使用 pandas)

3 投票
1 回答
6014 浏览
提问于 2025-04-17 23:12

我正在努力完成一个作业,为此我需要在statsmodels中使用分类变量(因为我不想像其他人那样使用stata)。我花了一些时间阅读Patsy和Statsmodels的文档,但我还是搞不清楚为什么这段代码不工作。我尝试将它拆解并用patsy的命令重新创建,但还是出现了同样的错误。

我目前的代码是:

import numpy as np
import pandas as pd
import statsmodels.formula.api as sm


# This is where I'm getting data
data = pd.read_csv("http://people.stern.nyu.edu/wgreene/Econometrics/bankdata.csv")

# I want to use this form for my regression
form = "C ~ Q1 + Q2 + Q3 + Q4 + Q5 + C(BANK)"

# Do the regression
mod = sm.ols(form, data=data)
reg = mod.fit()
print(reg.summary2())

这段代码报错,提示信息是:TypeError: 'Series' object is not callable。在statsmodels网站上有一个非常相似的例子,在这里,看起来运行得很好,我不太明白我做的和他们做的有什么不同。

非常感谢任何帮助。

谢谢

1 个回答

5

问题在于,C既是你数据表中一列的名字,同时也是patsy用来表示你想要一个分类变量的方式。最简单的解决办法就是把这一列改个名字:

data = data.rename_axis({'C': 'C_data'}, axis=1) form = "C_data ~ Q1 + Q2 + Q3 + Q4 + Q5 + C(BANK)"

这样调用sm.ols就可以正常工作了。

错误信息TypeError: 'Series' object is not callable可以这样理解:

  • patsy把C当作数据表中的一列来处理。在这种情况下,它就是data['C']这一列。
  • 接着,因为后面紧跟着括号,statsmodels就试图把data['C']当作一个函数来调用,并传入参数BANK。但是Series对象并没有实现__call__这个方法,所以就出现了'Series' object is not callable的错误信息。

祝你好运!

撰写回答