2016-05-20 200 views
1

我正在運行(我認爲是)使用Stats模型的相當簡單的多元線性迴歸模型。Statsmodel多元線性迴歸誤差 - Python

我的代碼如下:

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-learn中使用這個模型時,它工作正常。所以我認爲數據是有序的。

在此先感謝。

回答

0

patsy正在處理公式解析並解析字符串並將其解釋爲具有給定語法的公式。所以字符串中的某些元素是不允許的,因爲它們是公式語法的一部分。爲了讓他們的名字,懦夫也有一個代碼,用於取名字作爲文字文本Q應在這種情況下工作 http://patsy.readthedocs.io/en/latest/builtins-reference.html#patsy.builtins.Q

否則,如果你已經擁有了所有的虛擬變量的完整設計矩陣,則有沒有理由通過公式界面。使用直接接口大熊貓DataFrames或numpy的數組:

sm.OLS(y, x)

會忽略數據幀列的任何名稱,只是用它作爲在彙總表中的字符串。 變量/列名也被用作爲t_test定義限制的一種方式,但那些也通過patsy進行,我不確定它是否與名稱中的特殊字符一起工作。

+0

使用'Q'表示法仍然沒有工作。我得到了一個不同的錯誤。但是,當我按照你的建議使用直接接口時,它可以很好地處理變量名稱。謝謝! – Windstorm1981

1

,我得到的第一個錯誤是這樣的:

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 
          ^^^^^^^^^^^^^^^^^^^