滚动窗口adfTest具有修复起点

时间:2015-08-31 23:46:43

标签: r for-loop rollapply

所以我想在循环中运行带adfTestlag=0的{​​{1}},因此起始窗口为type="c",完成窗口为{{1} }。 问题是我希望启动窗口是固定的,所以如果数据包含10个数据点,则第一个结果来自length=5,第二个结果来自lenght=nrow(Data),依此类推,直到它以1:5结束。

我已尝试使用rollapply进行此操作,但它不能以这种方式工作,我拥有的代码是:

1:6

它的作用是创建一个矩阵,由于起始窗口,我使用后者进行其他计算,并使用相应的丢失数据。但问题是起始窗口没有修复,所以第一次观察来自1:10,但第二次来自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计算ADF,但我不知道如何使用2:6 lag=1添加该功能的选项。

为了更清楚地假设我做rollapplyr,后续数据是我得到的结果和我想要的结果。

lag=0

请注意,我想在循环中执行它,因为我希望每次完成循环时宽度都会增加,直到窗口是整个数据集的大小。

1 个答案:

答案 0 :(得分: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)

我对rollapplysapply版本进行了基准测试,对于这种情况,两个版本的执行时间都相同。