2016-12-10 56 views
1

我使用以下命令在大約200列上運行forecast::Acf。現在我想生成一個盒形圖,顯示滯後1:36的相關值分佈。生成多個ACF的箱線圖

## a simple example 
d <- data.frame(ts1 = rnorm(100), ts2 = rnorm(100)) 
acorr <- apply(d, 2, Acf) 

我現在想要的是一個箱線圖,其中的x值是1,2和y的值都爲ACF和ts1ts2

回答

2

假設你有存儲在數據幀d(每列是一個系列的),我們可以使用以下方法來獲取ACF最多落後36多個時間序列(nrow(d) >> 36有道理!):

## for data frame `d` 
acfs <- sapply(d, function (u) c(acf(u, lag.max = 36, plot = FALSE)$acf)[-1]) 
  • R基函數acf就足夠了;設置爲lag.max = 36plot = FALSE;
  • acf返回一個列表,我們想要$acf字段。請注意,這是一個3D箭頭,因此我們想要使用c()將其平坦化爲矢量;
  • 滯後0的ACF是1並且不重要,所以我們將其降低[-1];
  • sapply會返回一個矩陣,每列給每個系列的ACF。

如果你已經存儲在一個矩陣的時間序列(用普通的矩陣或一個以「MTS」類),我們使用apply而不是sapply

## for matrix `d` 
acfs <- apply(d, 2L, function (u) c(acf(u, lag.max = 36, plot = FALSE)$acf)[-1]) 

要生產的箱線圖,簡單地用途:

boxplot(acfs) 

boxplot


爲什麼$acf是3D陣列。因爲acf函數可以直接處理多個時間序列。嘗試:

## whether `d` is data frame or matrix, it is converted to "mts" inside `acf` 
oo <- acf(d, lag.max = 36, plot = FALSE)$acf 

問題是,在這種情況下,還會計算互相關(CCF)。


在x軸我想要1-36,不ts1ts2。我需要按照時間序列的每個滯後分佈。如果你能解決你的答案非常好。

Ei?我誤解了你的問題嗎?那麼,在這種情況下,你的acfs只是boxplot轉置:

boxplot(t(acfs)) 

trans

+0

在X軸上,我想1-36,不TS1和TS2。所有列的每個滯後分佈。如果你能確定你的回答非常好。 – user3139545