滚动 Window 具有固定起点的 adfTest
Rolling Window adfTest with fix starting point
所以我想 运行 adfTest
与 lag=0
和 type="c"
循环,所以起始 window 是 length=5
完成 window 是 lenght=nrow(Data)
。
问题是我希望起始 window 是固定的,所以如果数据包含 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"]
}
它的作用是创建一个矩阵,由于起始 window,我将其用于其他计算以及相应的丢失数据。但问题是开始的 window 不固定,所以第一个观察来自 1:5
但第二个观察来自 2:6
;它还使用 lag=1
计算 ADF,我不知道如何使用 lag=0
的 rollapplyr
添加函数的选项。
为了更清楚,假设我做了 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
请注意,我想在循环中执行此操作,因为我希望每次完成循环时宽度都会增加,直到 window 是整个数据集的大小。
再次查看您的问题,似乎可以通过将 rollapply
替换为 sapply
并删除 list
wi
来简化代码。这里r1
是开始日期,r2
是结束日期,window=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
版本进行了基准测试,对于这种情况,两个版本的执行时间是相同的。
所以我想 运行 adfTest
与 lag=0
和 type="c"
循环,所以起始 window 是 length=5
完成 window 是 lenght=nrow(Data)
。
问题是我希望起始 window 是固定的,所以如果数据包含 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"]
}
它的作用是创建一个矩阵,由于起始 window,我将其用于其他计算以及相应的丢失数据。但问题是开始的 window 不固定,所以第一个观察来自 1:5
但第二个观察来自 2:6
;它还使用 lag=1
计算 ADF,我不知道如何使用 lag=0
的 rollapplyr
添加函数的选项。
为了更清楚,假设我做了 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
请注意,我想在循环中执行此操作,因为我希望每次完成循环时宽度都会增加,直到 window 是整个数据集的大小。
再次查看您的问题,似乎可以通过将 rollapply
替换为 sapply
并删除 list
wi
来简化代码。这里r1
是开始日期,r2
是结束日期,window=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
版本进行了基准测试,对于这种情况,两个版本的执行时间是相同的。