2016-12-10 6 views
1

Я использовал следующее, чтобы запустить forecast::Acf около 200 столбцов. Теперь я хотел бы создать коробку, показывающую распределение значений корреляции в лаг 1:36.Создайте ящик для нескольких ACF

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

Что я теперь хочу это boxplot где х-значения 1,2 и у-значения АКФ для ts1 и ts2.

ответ

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 = 36 и plot = FALSE;
  • acf возвращает список, и мы хотим, чтобы поле $acf. Обратите внимание, что это 3D-аранжировка, поэтому мы хотим сгладить ее в вектор, используя c();
  • ACF at lag 0 is 1 и не представляет интереса, поэтому мы бросаем его на [-1];
  • sapply вернет матрицу, каждый столбец дает ACF для каждой серии.

В случае, если вы временные ряды хранятся в виде матрицы (либо обычная матрица или один с «МТС» класс), мы используем apply, а не sapply:

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

Для получения boxplot, просто использование:

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).


На оси х я хочу 1-36, не ts1 и ts2. Мне нужно распределение по каждой задержке во временном ряду. Если вы можете исправить, что ваш ответ очень хорош.

Ei? Я неправильно понял ваш вопрос. Ну, в таком случае, вы просто boxplot транспонированная acfs:

boxplot(t(acfs)) 

trans

+0

На оси х я хочу 1-36, не TS1 и TS2. Распределение по каждому отставанию по всем столбцам. Если вы можете исправить то, что ваш answere очень хорош. – user3139545