2017-04-10 124 views
4

我正在試驗以決定是否與自身相關的時間序列(如在,一個浮點列表)。我已經在statsmodels(http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.stattools.acf.html)中使用了acf函數,現在我正在研究Durbin-Watson統計是否有任何價值。一維時間序列數據的Durbin-Watson統計

好像這種事情應該工作:

from statsmodels.regression.linear_model import OLS 
import numpy as np 

data = np.arange(100) # this should be highly correlated 
ols_res = OLS(data) 
dw_res = np.sum(np.diff(ols_res.resid.values)) 

如果要運行它,你會得到:

Traceback (most recent call last): 
... 
    File "/usr/lib/pymodules/python2.7/statsmodels/regression/linear_model.py", line 165, in initialize 
    self.nobs = float(self.wexog.shape[0]) 
AttributeError: 'NoneType' object has no attribute 'shape' 

看來,d/W通常用於比較兩個時間序列(例如http://connor-johnson.com/2014/02/18/linear-regression-with-python/)的相關性,所以我認爲問題是我沒有通過另一個時間序列比較。也許這應該通過exog參數傳遞給OLS

exog : array-like 

A nobs x k array where nobs is the number of observations and k is 
the number of regressors. 

(從http://statsmodels.sourceforge.net/devel/generated/statsmodels.regression.linear_model.OLS.html

側面說明:我不知道一個 「NOBS X K」 陣列的意思。也許與數組是xk

那麼我應該在這裏做什麼?我是否預計會通過data兩次, 或手動延遲自己,還是?

謝謝!

回答

2

OLS是需要y和x(或endog和exog)的迴歸。在你的情況下,x需要至少是一個常數,即。 np.ones(len(endog),1)。

此外,您需要適合模型,即ols_res = OLS(y, x).fit()

nobs x k裝置2維用行k變量NOBS觀察列,即exog.shape是(nobs, k)

德賓沃森是串行相關性的檢驗統計量。它包含在OLS彙總輸出中。 statsmodels中還包含其他不包含自相關的測試。

(我會建議通過一些例子或補習的筆記本電腦工作。)

+0

謝謝。你能否確認將數據與自身關聯起來,我不需要自己拖延數據?只傳遞數據作爲獨立變量和一個常量向量作爲因變量。對? –

+0

在這種情況下,OLS將僅僅貶低數據。像DW或類似的殘差然後診斷測試然後可以使用,例如http://www.statsmodels.org/stable/stats.html#module-statsmodels.stats.stattools http://www.statsmodels.org/stable/diagnostic.html#autocorrelation-tests – user333700

+0

謝謝!我還貼出了代碼示例。 –

0

我已經接受user333700的答案,但我想後的代碼片段跟進。

這個小程序計算線性範圍(應高度相關,因此給出一個接近於0的值)的durbin-watson相關性,然後計算隨機值(它們不應該相關,因此給出的值接近於2):

from statsmodels.regression.linear_model import OLS 
import numpy as np 
from statsmodels.stats.stattools import durbin_watson 



def dw(data): 
    ols_res = OLS(data, np.ones(len(data))).fit() 
    return durbin_watson(ols_res.resid) 


print("dw of range=%f" % dw(np.arange(2000))) 
print("dw of rand=%f" % dw(np.random.randn(2000))) 

當運行:

dw of range=0.000003 
dw of rand=2.036162 

所以我覺得很好看:)