Предположит, у вас есть несколько временных рядов, хранящихся в кадре 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)
Почему $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))
На оси х я хочу 1-36, не TS1 и TS2. Распределение по каждому отставанию по всем столбцам. Если вы можете исправить то, что ваш answere очень хорош. – user3139545