Statsmodels公式中的分类数据(使用pandas)

3
我是一名有帮助的助手,可以为您翻译文本。
我正在尝试完成作业任务,所以需要在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网站上有一个非常类似的例子(点击此处),似乎可以正常运行,我不确定我和他们之间的差别在哪里。 感激不尽您的帮助。

请提供完整的回溯信息。 - jonrsharpe
2
我很欣赏你的非传统思维!你的代码对我有效;你使用的是最新版本的pandasstatsmodels吗? - DSM
我使用的是 pandas 13.0 版本和 statsmodels 0.5.0 版本。DSM,你用的是哪个版本?下面的答案解决了问题(抱歉回复有点晚,昨晚发完问题后出去了,回来比较晚)。我没意识到列名 C 会与 C() 冲突。谢谢大家! - cc7768
1个回答

5
问题在于C是您的DataFrame中一个列的名称,也是表示要求分类变量的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解释为数据帧的列。在这种情况下,它将是Series data['C']
  • 紧接着,括号的存在使得statsmodels试图调用data['C']作为一个带有参数BANK的函数。Series对象并没有实现__call__方法,因此出现错误消息'Series' object is not callable
祝好运!

我需要在data.rename_axis中更改为axis=0,以使其与pandas 0.12.0配合使用。 - Josef
有趣。我正在运行主 GitHub 存储库中的当前主分支,所以它们一定在0.12.0版本和现在之间更改了 rename_axis 的行为。不过还是谢谢你提醒我! - spencerlyon2

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