Как запустить тест ADF для временного ряда.Нужно сначала поделить ряд по двум критериям и получить результаты для каждого отдельно в аккуратной таблице - PullRequest
0 голосов
/ 16 июня 2019

Необходимо запустить тест Аугментированного Дики-Фуллера для временного ряда.Есть 3 группы людей и 4 категории товаров.Мне нужно запустить тест ADF, чтобы получить результаты для каждой группы и каждой категории продуктов в отдельности, сгруппированные в таблицу.

Предложите df, содержащий расходы 3 групп людей на 4 категории продуктов:

library(xts)
library(lubridate)
library(aTSA)

data_df <- data.frame(Group = c(rep(1, 12), rep(2, 12), rep(3, 12)),
                      Category = rep(c(rep(111, 3), rep(112, 2), 
                                  rep(121, 5), rep(122, 2)), 3),
                      Spending = rnorm(36, 10, 3))

Расходы были сделаны в определенные годы (при условии, что это была половина года).Для теста ADF нам понадобится ts:

data_xts <- as.xts(data_df, order.by = ymd(rep(paste0(2005:2016, "07-01"), 3)))

Первое:

  1. как мне получить доступ к определенным результатам теста, скажем: p-значение типа 1, с запаздыванием 0
  2. Другое (более важное): как разделить таблицу по двум критериям («Группа» и «Категория») , чтобы получить результаты теста ваккуратный способ, подобный следующему:
Group  Category p-value
1      111        0.123
1      112        0.456
...

Если бы не было необходимости разбивать, я бы просто использовал adf.test(data_xts$Spending)

Я пытался использовать split(), но таким образом яможно было разделить таблицу только по одному критерию, а также я получил список данных, с которыми я не знал, что делать.

1 Ответ

0 голосов
/ 16 июня 2019

Вам необходимо split исходный фрейм данных, а не серия xts, списком с элементами Group и Category.Затем запустите тесты для каждого результирующего члена списка.

sp <- split(data_df, list(data_df$Group, data_df$Category))

res <- lapply(sp, function(DF) {
  err <- tryCatch(
    adf.test(DF[['Spending']], nlag = 1),
    error = function(e) e)
})

Теперь посмотрите, какие были ошибки, и сохраните остальные.

keep <- !sapply(res, inherits, "error")

OK <- res[keep]
ERR <- res[!keep]

Наконец, извлеките результаты type? в матрицу.

Type1 <- do.call(rbind, lapply(OK, '[[', 'type1'))
Type2 <- do.call(rbind, lapply(OK, '[[', 'type2'))
Type3 <- do.call(rbind, lapply(OK, '[[', 'type3'))
rownames(Type1) <- names(OK)
rownames(Type2) <- names(OK)
rownames(Type3) <- names(OK)

Type1
#      lag         ADF    p.value
#1.111   0 -0.71919548 0.41178921
#2.111   0 -2.03281443 0.04332142
#3.111   0  0.14723783 0.67762240
#1.121   0 -0.04341668 0.62275779
#2.121   0 -1.78744138 0.07322266
#3.121   0 -0.45198372 0.50518454

Значение по умолчанию nlag.

В приведенном выше коде я использовал nlag = 1.
В документации aTSA::adf.test сказано (обратите внимание наопечатка) что задержка по умолчанию используется для вычисления статистики теста.

Мы используем значение по умолчанию nlag = floor (4 * (length (x) / 100) ^ (2/9)) для вычисления статистики теста.

ToДля этого код станет следующим.

res_b <- lapply(sp, function(DF) {
  err <- tryCatch(
    adf.test(DF[['Spending']]),
    error = function(e) e)
})

keep <- !sapply(res, inherits, "error")

OK_b <- res_b[keep]
ERR_b <- res_b[!keep]

Type1_b <- do.call(rbind, lapply(OK_b, '[[', 'type1'))
Type2_b <- do.call(rbind, lapply(OK_b, '[[', 'type2'))
Type3_b <- do.call(rbind, lapply(OK_b, '[[', 'type3'))
rownames(Type1_b) <- sapply(names(OK), paste, unique(Type1_b[, 'lag']), sep = '.')
rownames(Type2_b) <- sapply(names(OK), paste, unique(Type2_b[, 'lag']), sep = '.')
rownames(Type3_b) <- sapply(names(OK), paste, unique(Type3_b[, 'lag']), sep = '.')

Type1_b
#        lag         ADF    p.value
#1.121.0   0 -0.04341668 0.62275779
#1.121.1   1  0.37003728 0.74173735
#1.121.2   2         NaN        NaN
#2.121.0   0 -1.78744138 0.07322266
#2.121.1   1 -1.16668314 0.25338650
#2.121.2   2         NaN        NaN
#3.121.0   0 -0.45198372 0.50518454
#3.121.1   1  0.03268111 0.64465644
#3.121.2   2         NaN        NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...