Скользящее окно 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
и устранение list
wi
, Вот 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
версии и, в этом случае, время выполнения для обеих версий одинаковы.