所以我想做一个滚动窗口,每次它结束时再次使用更大的窗口来计算ADF测试。我在rollapplyr()
循环中while
进行思考,但我所做的并不奏效。此外,我希望每次滚动ADF测试时都会创建一个新数据。
这是我的代码:
C <- read.table("C:/Users/Alejandro/Documents/Universidad/Tesis/NASDAQ.csv", text = Lines, sep=",",dec=".",header=T)
head(C)
Date Dividend
1 1 587.2105
2 2 564.3108
3 3 548.4872
4 4 521.1410
5 5 541.0921
6 6 563.5000
r11<-1
T<- 1336
rw<-9
for(i in 1:1326){
while(r11<=T-rw+i){
wi <- rollapplyr(C$Dividend, rw+i,function(u) adf.test(u)$statistic)
r11<-r11+i
}
}
由于某种原因,它在ADF的第一次滚动时停止,因此它只是创建数据w1
答案 0 :(得分:2)
adf.test
返回的值的数量因rollapplyr
中滚动窗口的大小而异,因此您需要在 jeremycg 显示的列表中累积结果在他的回答中。但是do.call
函数可能无法正常工作。我尝试使用具有相同数量的数据点和窗口大小的随机红利数据来复制您的问题,并发现它运行了很长时间。为了减少运行时间,同时仍然在一系列窗口大小上给出结果,我修改了代码以在被除数系列中等间隔时间而不是每次都计算ADF结果。此外,滚动窗口的大小增加值>&gt;。 1。代码现在运行几秒钟。 wi
中包含的结果包括被除数系列中的采样间隔和窗口大小。您可以根据需要调整num_wind_sizes
和num_samples
以获得更密集的采样。此外,还会为ADF statistic
的每个值显示滚动窗口的结束日期。
<强>更新强>
感谢您的澄清。我已经通过几种方式简化了以下代码。窗口大小的增量固定为1.可以直接指定采样间隔大小;选择sample_interval
= 1会在每个Date
点进行ADF计算,这是我理解您要查找的内容。此外,我已将计算出的ADF统计数据收集到矩阵DF
中,这可能更容易用于您的目的。 DF
的行索引是ADF计算中使用的窗口的结束Dates
。 DF
的列索引是ADF计算中使用的窗口大小。例如,DF[16,10]
是以Date = 16结尾的10个连续日期系列的ADF统计量;即使用window = 10.以下示例计算的输出仅使用20个日期可能有助于澄清这一点。
library(zoo)
library(tseries)
# num_random <- 1336
num_random <- 20
set.seed(123)
C <- data.frame(Date=1:num_random, Dividend=550 + 30*rnorm(num_random)) # generate randum sample data
# C <- read.table("C:/Users/Alejandro/Documents/Universidad/Tesis/NASDAQ.csv", text = Lines, sep=",",dec=".",header=T)
num_dividends <- nrow(C)
head(C)
rw<-9
sample_interval <- 1 # sampling interval along dividend series;
# sample_interval = 1 causes every point in dividend series to be used
wi <- list()
DF <- matrix(0, nrow=num_dividends, ncol=num_dividends-1)
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) adf.test(u)$statistic, by=sample_interval)))))
DF[seq((rw+i),num_dividends,sample_interval), i+rw] <- wi[[i]]$DF[,"statistic"]
}
# row indices of DF are the end Date of the window used in the ADF calculation
# column indices of DF are the window sizes used in the ADF calculation
# for example, DF[16,10] is the ADF statistic for Date = 16 using a window =10
print(DF, digits=4)
答案 1 :(得分:0)
每次迭代都会覆盖输出。
wi
每次都被覆盖。听起来您希望wi
为w1
,w2
等等i
增量,但R不会以这种方式工作。
我也已将您的r11 <- r11 + i
更正为+ 1
,因为我猜到了您的意思,如果不是,请将其更改。
修复代码并使其快速运行的最简单方法是将wi
列为一个列表,然后在最后对其进行rbind:
r11 <- 1
T <- 1336
rw <- 9
wi <- list()
for(i in 1:1326){
while(r11 <= T - rw + i){
wi[i] <- rollapplyr(C$Dividend, rw + i, function(u) adf.test(u)$statistic)
r11 <- r11 + 1
}
}
wi <- do.call(rbind, wi)