Statsmodel多元线性回归错误 - Python

4
我是使用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_2015piv数据框中除"y"外的列。
这是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-learn中拟合这个模型时,一切正常。所以我认为数据是正确的。

提前致谢。

4个回答

8
我收到的第一个错误是这样的:
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
                           ^^^^^^^^^^^^^^^^^^^

2

patsy负责公式解析,使用给定的语法将字符串解析和解释为公式。因此,字符串中的某些元素不允许,因为它们是公式语法的一部分。为了将它们保留为名称,patsy还有一个可用于将名称作为文字文本的代码Q,在这种情况下应该适用。

http://patsy.readthedocs.io/en/latest/builtins-reference.html#patsy.builtins.Q

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

sm.OLS(y, x)

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


2
使用“Q”符号仍然无法正常工作。我得到了一个不同的错误。然而,当我按照你建议的直接接口使用时,变量名保持不变,它可以正常工作。谢谢! - Windstorm1981
请注意,这并不总是会给你相同的结果。例如,只有在使用statsmodels MANOVA中的公式时,模型才会拟合截距。https://www.statsmodels.org/dev/generated/statsmodels.multivariate.manova.MANOVA.html - Johannes Wiesner

0
当你在公式中包含数字(除了0和1之外的数字)时,可能会出现这个错误,比如y ~ 1.23 * var1 + 4.56 * var2

0

错误:Temp ~ MEI+ CO2+ CH4+ N2O+ Q(“CFC-11+ CFC-12”)+ TSI+ Aerosols

答案:Temp 〜 MEI + CO2 + CH4 + N2O + CFC_11 + CFC_12 + TSI + Aerosols。

您需要删除列名中的减号或连字符(' - '),小括号以解决该问题。

    df = pd.read_csv(filepath)
    col = []
    for i in df.columns:
        i = i.replace('-','_')
        i = i.replace('(','_')
        i = i.replace(')','_')
        col.append(i)
    df.columns = columns

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