Есть ли способ автоматизировать различие временных рядов в R? - PullRequest
1 голос
/ 07 февраля 2020

Я бы хотел провести анализ временных рядов. Когда, например, у меня есть временной ряд, выраженный в виде одной строки кадра данных, я получаю следующую ошибку при выполнении расширенного теста Дики-Фуллера: «Ошибка в tseries :: adf.test (B): x is не вектор или одномерный временной ряд. " Итак, я превратил это в вектор:

library(urca)
B <- c(34,34,34,34,34,34,35,100,34,34,35,100,34)
B
plot(B)
tseries::adf.test(B)

Но тогда временной ряд должен быть частью фрейма данных, чтобы применить различие, иначе я получу ошибку:

«Ошибка в применении (B, 1, f1): dim (X) должен иметь положительную длину»,

Итак, я переопределил B вручную следующим образом:

A <- c(34)
C <- c(34)
D <- c(34)
E <- c(34)
F <- c(34)
G <- c(34)
H <- c(35)
I <- c(100)
J <- c(34)
K <- c(34)
L <- c(35)
M <- c(100)
N <- c(34)
B <- data.frame(A,C,D,E,F,G,H,I,J,K,L,M,N)
B
f1 = function(x){return(diff(x))}
C <- (t(apply(B,1, f1)))
C <- data.frame(t(apply(B,1, f1)))
class(C)

R затем говорит мне, что класс C является фреймом данных. Если я сохраню C в этом формате, при повторном выполнении теста DF я снова получаю «Ошибка в tseries :: adf.test (C): x не является вектором или одномерным временным рядом». Если я не включаю «data.frame», он говорит, что класс C является цифрой c, и я получаю следующую ошибку при повторном выполнении теста DF: «Ошибка при вставке (y, k): неправильно "размер встраивания".

Поэтому я вручную переписал результат как вектор:

C <- c(0,0,0,0,0,1,65,-66,0,1,65,-66)
class(C)
C
plot(C)
tseries::adf.test(C) 

Что все работает нормально, но есть ли способ автоматизировать это, поэтому мне не нужно продолжать преобразовывать вектор из фрейма данных в вектор? Я хотел бы сохранить все как фрейм данных, если это возможно.

Большое спасибо!

1 Ответ

1 голос
/ 07 февраля 2020

Вы можете преобразовать B в объект time.series:

B_ts <- ts(B)

Затем вы можете указать частоту, начало и конец временного ряда, подробнее см. ?ts.

Если вы хотите взять разницу первого порядка B, вы можете просто использовать diff(B). Данные не обязательно должны быть для этого

...