Statsmodel多元线性回归误差 - Python

时间:2016-05-20 22:08:00

标签: python linear-regression statsmodels

我正在运行(我认为是)使用Stats模型拟合相当简单的多元线性回归模型。

我的代码如下:

y = 'EXITS|20:00:00'
all_columns = "+".join(y_2015piv.columns - ['EXITS|20:00:00'])
reg_formula = "y~" + all_columns

lm= smf.ols(formula=reg_formula, data=y_2015piv).fit()

因为我有大约30个因子变量,所以我使用Python字符串操作创建公式。 " Y"如上所述。 all_columns是没有" y"的数据框y_2015piv列。

这是all_columns:

DAY_Fri+DAY_Mon+DAY_Sat+DAY_Sun+DAY_Thu+DAY_Tue+DAY_Wed+ENTRIES|00:00:00+ENTRIES|04:00:00+ENTRIES|08:00:00+ENTRIES|12:00:00+ENTRIES|16:00:00+ENTRIES|20:00:00+EXITS|00:00:00+EXITS|04:00:00+EXITS|08:00:00+EXITS|12:00:00+EXITS|16:00:00+MONTH_Apr+MONTH_Aug+MONTH_Dec+MONTH_Feb+MONTH_Jan+MONTH_Jul+MONTH_Jun+MONTH_Mar+MONTH_May+MONTH_Nov+MONTH_Oct+MONTH_Sep

数据框中的值是连续数值变量和0/1虚拟变量。

当我尝试适应模型时,我收到此错误:

PatsyError: numbers besides '0' and '1' are only allowed with **
    y~DAY_Fri+DAY_Mon+DAY_Sat+DAY_Sun+DAY_Thu+DAY_Tue+DAY_Wed+ENTRIES|00:00:00+ENTRIES|04:00:00+ENTRIES|08:00:00+ENTRIES|12:00:00+ENTRIES|16:00:00+ENTRIES|20:00:00+EXITS|00:00:00+EXITS|04:00:00+EXITS|08:00:00+EXITS|12:00:00+EXITS|16:00:00+MONTH_Apr+MONTH_Aug+MONTH_Dec+MONTH_Feb+MONTH_Jan+MONTH_Jul+MONTH_Jun+MONTH_Mar+MONTH_May+MONTH_Nov+MONTH_Oct+MONTH_Sep

没有什么可以解决这个问题。任何帮助表示赞赏。

顺便说一下,当我在Scikit中使用这个模型时 - 学习它可以正常工作。所以我认为数据是有序的。

提前致谢。

2 个答案:

答案 0 :(得分:3)

我得到的第一个错误是:

PatsyError: numbers besides '0' and '1' are only allowed with **
Temp ~ MEI+ CO2+ CH4+ N2O+ CFC-11+ CFC-12+ TSI+ Aerosols
                               ^^

根据此链接:http://patsy.readthedocs.io/en/latest/builtins-reference.html#patsy.builtins.Q 您可以在公式中使用Q(“var”)来消除错误。我得到了同样的错误,但它已经解决了。

linMod = smf.ols('Temp ~ MEI+ CO2+ CH4+ N2O+ Q("CFC-11")+ Q("CFC-12")+ TSI+ Aerosols',data = trainingSet).fit()

这是已解决的代码行。我试过了

linMod = smf.ols('Temp ~ MEI+ CO2+ CH4+ N2O+ Q("CFC-11 + CFC-12")+ TSI+ Aerosols',data = trainingSet).fit()

但这不起作用。似乎在使用公式时,数字和变量碰巧具有某些意义,不允许使用某些名称。在我的情况下错误是:

PatsyError: Error evaluating factor: NameError: no data named 'CFC-11+ CFC-12' found
Temp ~ MEI+ CO2+ CH4+ N2O+ Q("CFC-11+ CFC-12")+ TSI+ Aerosols
                           ^^^^^^^^^^^^^^^^^^^

答案 1 :(得分:1)

patsy正在处理公式解析并正在解析字符串并将其解释为具有给定语法的公式。因此,不允许字符串中的某些元素,因为它们是公式语法的一部分。为了将它们保留为名称,patsy还有一个代码,用于将名称作为文本文本Q,在这种情况下应该起作用 http://patsy.readthedocs.io/en/latest/builtins-reference.html#patsy.builtins.Q

否则,如果您已经拥有包含所有虚拟变量的完整设计矩阵,则没有理由通过公式接口。使用带有pandas DataFrames或numpy数组的直接接口:

sm.OLS(y, x)

将忽略DataFrame列的任何名称,除非在摘要表中将其用作字符串。 变量/列名也被用作定义t_test限制的一种方式,但那些也是通过patsy进行的,我不确定它是否适用于名称中的特殊字符。