rollapplyr移动窗口ADF

时间:2015-08-18 00:38:34

标签: r for-loop while-loop oracle-adf

所以我想做一个滚动窗口,每次它结束时再次使用更大的窗口来计算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

2 个答案:

答案 0 :(得分:2)

adf.test返回的值的数量因rollapplyr中滚动窗口的大小而异,因此您需要在 jeremycg 显示的列表中累积结果在他的回答中。但是do.call函数可能无法正常工作。我尝试使用具有相同数量的数据点和窗口大小的随机红利数据来复制您的问题,并发现它运行了很长时间。为了减少运行时间,同时仍然在一系列窗口大小上给出结果,我修改了代码以在被除数系列中等间隔时间而不是每次都计算ADF结果。此外,滚动窗口的大小增加值>&gt;。 1。代码现在运行几秒钟。 wi中包含的结果包括被除数系列中的采样间隔和窗口大小。您可以根据需要调整num_wind_sizesnum_samples以获得更密集的采样。此外,还会为ADF statistic的每个值显示滚动窗口的结束日期。

<强>更新

感谢您的澄清。我已经通过几种方式简化了以下代码。窗口大小的增量固定为1.可以直接指定采样间隔大小;选择sample_interval = 1会在每个Date点进行ADF计算,这是我理解您要查找的内容。此外,我已将计算出的ADF统计数据收集到矩阵DF中,这可能更容易用于您的目的。 DF的行索引是ADF计算中使用的窗口的结束DatesDF的列索引是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每次都被覆盖。听起来您希望wiw1w2等等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)