Statsmodels 从公式生成分类数据(使用 pandas)
我正在努力完成一个作业,为此我需要在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
的错误信息。
祝你好运!