Скользящее окно adfTest с фиксированной отправной точкой

Поэтому я хочу запустить adfTest с lag=0 а также type="c" в цикле, поэтому начальное окно имеет length=5 и финишное окно lenght=nrow(Data), Дело в том, что я хочу, чтобы начальное окно было исправлено, поэтому, если данные содержат 10 данных, первый результат получается из 1:5, второй 1:6 и так до тех пор, пока не закончится 1:10,

Я попытался сделать это с rollapply, но это не работает, код, который я имею:

num_dividends <- nrow(C)
rw<-4
sample_interval <- 1 
wi <- list()
DF <- matrix(0, nrow=num_dividends, ncol=num_dividends)
for(i in 1:(num_dividends-rw-1) )  {
  wi <- c(wi,list(list(c(window_size=rw+i,sample_interval=sample_interval),
                       DF=cbind(Date=seq(rw+i, num_dividends, by=sample_interval),
                       statistic=rollapplyr(C$Dividend, rw+i, function(u) adfTest(u)@test$statistic,by=sample_interval,partial=T)))))
  DF[seq((rw+i),num_dividends,sample_interval), i+rw] <- wi[[i]]$DF[,"statistic"]
}

Что он делает, так это то, что он создает матрицу, которую я использую для других вычислений с соответствующими потерянными данными благодаря стартовому окну. Но ПРОБЛЕМА заключается в том, что начальное окно не является фиксированным, поэтому первое наблюдение идет от 1:5 но второе идет от 2:6; также он рассчитывает АПД с lag=1 и я не знаю, как добавить опцию функции с rollapplyr из lag=0,

Чтобы было понятнее, предположим, что я делаю rollapplyr(C$Dividend, 5, FUN=mean,by=sample_interval) и последующие данные - это результаты, которые я получаю и чего хочу.

Dividend    This is What I Want     This is What I Get 
1                    NA                       NA
2                    NA                       NA
3                    NA                       NA
4                    NA                       NA
5                     3                        3
6                    3.5                       4
7                     4                        5
8                    4.5                       6
9                     5                        7

Обратите внимание, что я хочу сделать это в цикле, потому что я хочу, чтобы ширина увеличивалась каждый раз, когда он заканчивает цикл, пока окно не станет размером всего набора данных.

1 ответ

Решение

Рассматривая вашу проблему еще раз, кажется, что код можно упростить, заменив rollapply с sapply и устранение listwi, Вот r1 дата начала, r2 это дата окончания, а окно = r2 - r1 + 1,

  library(zoo)
  library(tseries)
  num_random <- 20
  set.seed(123)
  C <- data.frame(Date=1:num_random, Dividend=550 + 30*rnorm(num_random))  # generate randum sample data
  num_dividends <- nrow(C)
  head(C)

  rw_min <- 9         #   minimum window size
  DF2 <- matrix(NA_real_, nrow=num_dividends, ncol= num_dividends-rw_min+1)
  for( r1 in 1:(num_dividends-rw_min + 1))  {
     r2 <- (r1+rw_min-1):num_dividends
     DF2[r2,r1] <- sapply(r2, FUN=function(n) adf.test(C$Dividend[r1:n])$statistic)
  }
  # column indices of DF2 are r1, the start Dates used in the ADF calculation
  # row indices of DF2 are r2, the end Dates of the window used in the ADF calculation 
  # window size = r2-r1+1 
  # For example, DF2[15,1] is the ADF statistic for start Date = 1 and end Date = 15 with window = 15 
  print(DF2, digits=4)

Я сравнил rollapply а также sapply версии и, в этом случае, время выполнения для обеих версий одинаковы.

Другие вопросы по тегам