Nothing
# cce() Cumulative Covariance Estimator
#
# CumulativeCovarianceEstimator
#
# returns a matrix of var-cov estimates
########################################################
# functions for the synchronization
########################################################
# refresh time
## data: a list of zoos
refresh_sampling <- function(data){
d.size <- length(data)
if(d.size>1){
#ser.times <- vector(d.size, mode="list")
#ser.times <- lapply(data,time)
ser.times <- lapply(lapply(data,"time"),"as.numeric")
ser.lengths <- sapply(data,"length")
ser.samplings <- vector(d.size, mode="list")
#refresh.times <- c()
if(0){
tmp <- sapply(ser.times,"[",1)
refresh.times[1] <- max(tmp)
I <- rep(1,d.size)
for(d in 1:d.size){
#ser.samplings[[d]][1] <- max(which(ser.times[[d]]<=refresh.times[1]))
while(!(ser.times[[d]][I[d]+1]>refresh.times[1])){
I[d] <- I[d]+1
if((I[d]+1)>ser.lengths[d]){
break
}
}
ser.samplings[[d]][1] <- I[d]
}
i <- 1
#while(all(sapply(ser.samplings,"[",i)<ser.lengths)){
while(all(I<ser.lengths)){
J <- I
tmp <- double(d.size)
for(d in 1:d.size){
#tmp[d] <- ser.times[[d]][min(which(ser.times[[d]]>refresh.times[i]))
repeat{
J[d] <- J[d] + 1
tmp[d] <- ser.times[[d]][J[d]]
if((!(J[d]<ser.lengths))||(tmp[d]>refresh.times[i])){
break
}
}
}
i <- i+1
refresh.times[i] <- max(tmp)
for(d in 1:d.size){
#ser.samplings[[d]][i] <- max(which(ser.times[[d]]<=refresh.times[i]))
while(!(ser.times[[d]][I[d]+1]>refresh.times[i])){
I[d] <- I[d]+1
if((I[d]+1)>ser.lengths[d]){
break
}
}
ser.samplings[[d]][i] <- I[d]
}
}
}
MinL <- min(ser.lengths)
refresh.times <- double(MinL)
refresh.times[1] <- max(sapply(ser.times,"[",1))
#idx <- matrix(.C("refreshsampling",
# as.integer(d.size),
# integer(d.size),
# as.double(unlist(ser.times)),
# as.double(refresh.times),
# as.integer(append(ser.lengths,0,after=0)),
# min(sapply(ser.times,FUN="tail",n=1)),
# as.integer(MinL),
# result=integer(d.size*MinL))$result,ncol=d.size)
idx <- matrix(.C("refreshsampling",
as.integer(d.size),
integer(d.size),
as.double(unlist(ser.times)),
as.double(refresh.times),
as.integer(ser.lengths),
as.integer(diffinv(ser.lengths[-d.size],xi=0)),
min(sapply(ser.times,FUN="tail",n=1)),
as.integer(MinL),
result=integer(d.size*MinL),
PACKAGE = "yuima")$result, # PACKAGE is added (YK, Dec 4, 2018)
ncol=d.size)
result <- vector(d.size, mode="list")
for(d in 1:d.size){
#result[[d]] <- data[[d]][ser.samplings[[d]]]
result[[d]] <- data[[d]][idx[,d]]
}
return(result)
}else{
return(data)
}
}
# refresh sampling for PHY
## data: a list of zoos
refresh_sampling.PHY <- function(data){
d.size <- length(data)
if(d.size>1){
ser.times <- lapply(lapply(data,"time"),"as.numeric")
ser.lengths <- sapply(data,"length")
#refresh.times <- max(sapply(ser.times,"[",1))
ser.samplings <- vector(d.size,mode="list")
if(0){
for(d in 1:d.size){
ser.samplings[[d]][1] <- 1
}
I <- rep(1,d.size)
i <- 1
while(all(I<ser.lengths)){
flag <- integer(d.size)
for(d in 1:d.size){
while(I[d]<ser.lengths[d]){
I[d] <- I[d]+1
if(ser.times[[d]][I[d]]>refresh.times[i]){
flag[d] <- 1
ser.samplings[[d]][i+1] <- I[d]
break
}
}
}
if(any(flag<rep(1,d.size))){
break
}else{
i <- i+1
tmp <- double(d.size)
for(d in 1:d.size){
tmp[d] <- ser.times[[d]][ser.samplings[[d]][i]]
}
refresh.times <- append(refresh.times,max(tmp))
}
}
}
MinL <- min(ser.lengths)
refresh.times <- double(MinL)
refresh.times[1] <- max(sapply(ser.times,"[",1))
#obj <- .C("refreshsamplingphy",
# as.integer(d.size),
# integer(d.size),
# as.double(unlist(ser.times)),
# rtimes=as.double(refresh.times),
# as.integer(append(ser.lengths,0,after=0)),
# min(sapply(ser.times,FUN="tail",n=1)),
# as.integer(MinL),
# Samplings=integer(d.size*(MinL+1)),
# rNum=integer(1))
obj <- .C("refreshsamplingphy",
as.integer(d.size),
integer(d.size),
as.double(unlist(ser.times)),
rtimes=as.double(refresh.times),
as.integer(ser.lengths),
as.integer(diffinv(ser.lengths[-d.size],xi=0)),
min(sapply(ser.times,FUN="tail",n=1)),
as.integer(MinL),
Samplings=integer(d.size*(MinL+1)),
rNum=integer(1),
PACKAGE = "yuima") # PACKAGE is added (YK, Dec 4, 2018)
refresh.times <- obj$rtimes[1:obj$rNum]
idx <- matrix(obj$Samplings,ncol=d.size)
result <- vector(d.size, mode="list")
for(d in 1:d.size){
#result[[d]] <- data[[d]][ser.samplings[[d]]]
result[[d]] <- data[[d]][idx[,d]]
}
return(list(data=result,refresh.times=refresh.times))
}else{
return(list(data=data,refresh.times=as.numeric(time(data[[1]]))))
}
}
# Bibinger's synchronization algorithm
## x: a zoo y: a zoo
Bibsynchro <- function(x,y){
xtime <- as.numeric(time(x))
ytime <- as.numeric(time(y))
xlength <- length(xtime)
ylength <- length(ytime)
N.max <- max(xlength,ylength)
if(0){
mu <- integer(N.max)
w <- integer(N.max)
q <- integer(N.max)
r <- integer(N.max)
if(xtime[1]<ytime[1]){
I <- 1
while(xtime[I]<ytime[1]){
I <- I+1
if(!(I<xlength)){
break
}
}
#mu0 <- min(which(ytime[1]<=xtime))
mu0 <- I
if(ytime[1]<xtime[mu0]){
#q[1] <- mu0-1
q[1] <- mu0
}else{
#q[1] <- mu0
q[1] <- mu0+1
}
r[1] <- 2
}else if(xtime[1]>ytime[1]){
I <- 1
while(xtime[I]<ytime[1]){
I <- I+1
if(!(I<xlength)){
break
}
}
#w0 <- min(which(xtime[1]<=ytime))
w0 <- I
q[1] <- 2
if(xtime[1]<ytime[w0]){
#r[1] <- w0-1
r[1] <- w0
}else{
#r[1] <- w0
r[1] <- w0+1
}
}else{
q[1] <- 2
r[1] <- 2
}
i <- 1
repeat{
#while((q[i]<xlength)&&(r[i]<ylength)){
if(xtime[q[i]]<ytime[r[i]]){
#tmp <- which(ytime[r[i]]<=xtime)
#if(identical(all.equal(tmp,integer(0)),TRUE)){
# break
#}
#mu[i] <- min(tmp)
if(xtime[xlength]<ytime[r[i]]){
break
}
I <- q[i]
while(xtime[I]<ytime[r[i]]){
I <- I+1
}
mu[i] <- I
w[i] <- r[i]
if(ytime[r[i]]<xtime[mu[i]]){
#q[i+1] <- mu[i]-1
q[i+1] <- mu[i]
}else{
#q[i+1] <- mu[i]
q[i+1] <- mu[i]+1
}
r[i+1] <- r[i]+1
}else if(xtime[q[i]]>ytime[r[i]]){
#tmp <- which(xtime[q[i]]<=ytime)
#if(identical(all.equal(tmp,integer(0)),TRUE)){
# break
#}
if(xtime[q[i]]>ytime[ylength]){
break
}
mu[i] <- q[i]
#w[i] <- min(tmp)
I <- r[i]
while(xtime[q[i]]>ytime[I]){
I <- I+1
}
w[i] <- I
q[i+1] <- q[i]+1
if(xtime[q[i]]<ytime[w[i]]){
#r[i+1] <- w[i]-1
r[i+1] <- w[i]
}else{
#r[i+1] <- w[i]
r[i+1] <- w[i]+1
}
}else{
mu[i] <- q[i]
w[i] <- r[i]
q[i+1] <- q[i]+1
r[i+1] <- r[i]+1
}
i <- i+1
if((q[i]>=xlength)||(r[i]>=ylength)){
break
}
}
mu[i] <- q[i]
w[i] <- r[i]
}
sdata <- .C("bibsynchro",
as.double(xtime),
as.double(ytime),
as.integer(xlength),
as.integer(ylength),
mu=integer(N.max),
w=integer(N.max),
q=integer(N.max),
r=integer(N.max),
Num=integer(1),
PACKAGE = "yuima")
Num <- sdata$Num
#return(list(xg=as.numeric(x)[mu[1:i]],
# xl=as.numeric(x)[q[1:i]-1],
# ygamma=as.numeric(y)[w[1:i]],
# ylambda=as.numeric(y)[r[1:i]-1],
# num.data=i))
return(list(xg=as.numeric(x)[sdata$mu[1:Num]+1],
xl=as.numeric(x)[sdata$q[1:Num]],
ygamma=as.numeric(y)[sdata$w[1:Num]+1],
ylambda=as.numeric(y)[sdata$r[1:Num]],
num.data=Num))
}
##############################################################
# functions for tuning parameter
##############################################################
set_utime <- function(data){
init.min <- min(as.numeric(sapply(data, FUN = function(x) time(x)[1])))
term.max <- max(as.numeric(sapply(data, FUN = function(x) tail(time(x), n=1))))
return(23400 * (term.max - init.min))
}
# Barndorff-Nielsen et al. (2009)
RV.sparse <- function(zdata,frequency=1200,utime){
znum <- as.numeric(zdata)
ztime <- as.numeric(time(zdata))*utime
n.size <- length(zdata)
end <- ztime[n.size]
grid <- seq(ztime[1],end,by=frequency)
n.sparse <- length(grid)
#result <- double(frequency)
#result <- 0
#I <- rep(1,n.sparse)
#for(t in 1:frequency){
# for(i in 1:n.sparse){
# while((ztime[I[i]+1]<=grid[i])&&(I[i]<n.size)){
# I[i] <- I[i]+1
# }
# }
# result[t] <- sum(diff(znum[I])^2)
#result <- result+sum(diff(znum[I])^2)
# grid <- grid+rep(1,n.sparse)
# if(grid[n.sparse]>end){
# grid <- grid[-n.sparse]
# I <- I[-n.sparse]
# n.sparse <- n.sparse-1
# }
#}
K <- floor(end-grid[n.sparse]) + 1
zmat <- matrix(.C("ctsubsampling",
as.double(znum),
as.double(ztime),
as.integer(frequency),
as.integer(n.sparse),
as.integer(n.size),
as.double(grid),
result=double(frequency*n.sparse),
PACKAGE = "yuima")$result,
n.sparse,frequency)
result <- double(frequency)
result[1:K] <- colSums(diff(zmat[,1:K])^2)
result[-(1:K)] <- colSums(diff(zmat[-n.sparse,-(1:K)])^2)
return(mean(result))
#return(result/frequency)
#return(znum[I])
}
Omega_BNHLS <- function(zdata,sec=120,utime){
#q <- ceiling(sec/mean(diff(as.numeric(time(zdata))*utime)))
#q <- ceiling(sec*(length(zdata)-1)/utime)
ztime <- as.numeric(time(zdata))
q <- ceiling(sec*(length(zdata)-1)/(utime*(tail(ztime,n=1)-head(ztime,n=1))))
obj <- diff(as.numeric(zdata),lag=q)
n <- length(obj)
#result <- 0
result <- double(q)
for(i in 1:q){
tmp <- obj[seq(i,n,by=q)]
n.tmp <- sum(tmp!=0)
if(n.tmp>0){
result[i] <- sum(tmp^2)/(2*n.tmp)
}
}
#return(result/q)
return(mean(result))
}
NSratio_BNHLS <- function(zdata,frequency=1200,sec=120,utime){
IV <- RV.sparse(zdata,frequency,utime)
Omega <- Omega_BNHLS(zdata,sec,utime)
return(Omega/IV)
}
# Pre-averaging estimator
selectParam.pavg <- function(data,utime,frequency=1200,sec=120,
a.theta,b.theta,c.theta){
if(missing(utime)) utime <- set_utime(data)
NS <- sapply(data,FUN=NSratio_BNHLS,frequency=frequency,sec=sec,utime=utime)
coef <- (b.theta+sqrt(b.theta^2+3*a.theta*c.theta))/a.theta
return(sqrt(coef*NS))
}
selectParam.TSCV <- function(data,utime,frequency=1200,sec=120){
if(missing(utime)) utime <- set_utime(data)
NS <- sapply(data,FUN=NSratio_BNHLS,frequency=frequency,sec=sec,
utime=utime)
return((12*NS)^(2/3))
}
selectParam.GME <- function(data,utime,frequency=1200,sec=120){
if(missing(utime)) utime <- set_utime(data)
NS <- sapply(data,FUN=NSratio_BNHLS,frequency=frequency,sec=sec,
utime=utime)
a.theta <- 52/35
#b.theta <- (12/5)*(NS^2+3*NS)
b.theta <- (24/5)*(NS^2+2*NS)
c.theta <- 48*NS^2
return(sqrt((b.theta+sqrt(b.theta^2+12*a.theta*c.theta))/(2*a.theta)))
}
selectParam.RK <- function(data,utime,frequency=1200,sec=120,cstar=3.5134){
if(missing(utime)) utime <- set_utime(data)
NS <- sapply(data,FUN=NSratio_BNHLS,frequency=frequency,sec=sec,
utime=utime)
return(cstar*(NS^(2/5)))
}
if(0){
selectParam_BNHLS <- function(yuima,method,utime=1,frequency=1200,sec=120,kappa=7585/1161216,
kappabar=151/20160,kappatilde=1/24,cstar=3.51){
data <- get.zoo.data(yuima)
switch(method,
"PHY"=selectParam.PHY(data,utime,frequency,sec,kappa,kappabar,kappatilde),
"GME"=selectParam.GME(data,utime,frequency,sec),
"RK"=selectParam.RK(data,utime,frequency,sec,cstar),
"PTHY"=selectParam.PHY(data,utime,frequency,sec,kappa,kappabar,kappatilde))
}
}
###############################################################
# functions for selecting the threshold functions
###############################################################
# local universal thresholding method
## Bipower variation
### x: a zoo lag: a positive integer
BPV <- function(x,lag=1){
n <- length(x)-1
dt <- diff(as.numeric(time(x)))
obj <- abs(diff(as.numeric(x)))/sqrt(dt)
result <- (pi/2)*(obj[1:(n-lag)]*dt[1:(n-lag)])%*%obj[(1+lag):n]
return(result)
}
## local univaersal thresholding method
### data: a list of zoos coef: a positive number
local_univ_threshold <- function(data,coef=5,eps=0.1){
d.size <- length(data)
result <- vector(d.size,mode="list")
for(d in 1:d.size){
x <- data[[d]]
#x <- as.numeric(data[[d]])
n <- length(x)-1
dt <- diff(as.numeric(time(x)))
obj <- abs(diff(as.numeric(x)))/sqrt(dt)
#dx <- diff(as.numeric(x))
#xtime <- time(x)
#xtime <- time(data[[d]])
#if(is.numeric(xtime)){
# r <- max(diff(xtime))
#}else{
# xtime <- as.numeric(xtime)
#r <- max(diff(xtime))/(length(x)-1)
# r <- max(diff(xtime))/(tail(xtime,n=1)-head(xtime,n=1))
#}
#K <- ceiling(sqrt(1/r))
#K <- max(ceiling(sqrt(1/r)),3)
K <- max(ceiling(n^0.5),3)
coef2 <- coef^2
rho <- double(n+1)
#tmp <- coef2*sum(dx^2)*n^(eps-1)
#tmp <- double(n+1)
#tmp[-(1:(K-1))] <- coef2*n^eps*rollmean(dx^2,k=K-1,align="left")
#tmp[1:(K-1)] <- tmp[K]
#dx[dx^2>tmp[-(n+1)]] <- 0
if(K<n){
#rho[1:K] <- coef2*(mad(diff(as.numeric(x)[1:(K+1)]))/0.6745)^2
#rho[1:K] <- coef2*2*log(K)*(mad(diff(x[1:(K+1)]))/0.6745)^2
#for(i in (K+1):n){
# rho[i] <- coef2*2*log(length(x))*BPV(x[(i-K):(i-1)])/(K-2)
#}
#rho[-(1:K)] <- coef2*2*log(n)^(1+eps)*
# #rollapply(x[-n],width=K,FUN=BPV,align="left")/(K-2)
rho[-(1:(K-1))] <- coef2*n^eps*(pi/2)*
rollmean((obj*dt)[-n]*obj[-1],k=K-2,align="left")
#rho[-(1:(K-1))] <- coef2*n^eps*rollmean(dx^2,k=K-1,align="left")
rho[1:(K-1)] <- rho[K]
}else{
#rho <- coef2*(mad(diff(as.numeric(x)))/0.6745)^2
#rho <- coef2*(mad(diff(x))/0.6745)^2
#rho <- coef2*2*log(n)^(1+eps)*BPV(x)
rho <- coef2*n^(eps-1)*BPV(x)
#rho <- coef2*sum(dx^2)*n^(eps-1)
}
result[[d]] <- rho[-(n+1)]
}
return(result)
}
#################################################################
# functions for calculating the estimators
#################################################################
# Hayashi-Yoshida estimator
## data: a list of zoos
HY <- function(data) {
n.series <- length(data)
# allocate memory
ser.X <- vector(n.series, mode="list") # data in 'x'
ser.times <- vector(n.series, mode="list") # time index in 'x'
ser.diffX <- vector(n.series, mode="list") # difference of data
for(i in 1:n.series){
# set data and time index
ser.X[[i]] <- as.numeric(data[[i]]) # we need to transform data into numeric to avoid problem with duplicated indexes below
ser.times[[i]] <- as.numeric(time(data[[i]]))
# set difference of the data
ser.diffX[[i]] <- diff( ser.X[[i]] )
}
# core part of cce
cmat <- matrix(0, n.series, n.series) # cov
for(i in 1:n.series){
for(j in i:n.series){
#I <- rep(1,n.series)
#Checking Starting Point
#repeat{
#while((I[i]<length(ser.times[[i]])) && (I[j]<length(ser.times[[j]]))){
# if(ser.times[[i]][I[i]] >= ser.times[[j]][I[j]+1]){
# I[j] <- I[j]+1
# }else if(ser.times[[i]][I[i]+1] <= ser.times[[j]][I[j]]){
# I[i] <- I[i]+1
# }else{
# break
# }
#}
#Main Component
if(i!=j){
#while((I[i]<length(ser.times[[i]])) && (I[j]<length(ser.times[[j]]))) {
# cmat[j,i] <- cmat[j,i] + (ser.diffX[[i]])[I[i]]*(ser.diffX[[j]])[I[j]]
# if(ser.times[[i]][I[i]+1]>ser.times[[j]][I[j]+1]){
# I[j] <- I[j] + 1
# }else if(ser.times[[i]][I[i]+1]<ser.times[[j]][I[j]+1]){
# I[i] <- I[i] +1
# }else{
# I[i] <- I[i]+1
# I[j] <- I[j]+1
# }
#}
cmat[j,i] <- .C("HayashiYoshida",as.integer(length(ser.times[[i]])),
as.integer(length(ser.times[[j]])),as.double(ser.times[[i]]),
as.double(ser.times[[j]]),as.double(ser.diffX[[i]]),
as.double(ser.diffX[[j]]),value=double(1),
PACKAGE = "yuima")$value
}else{
cmat[i,j] <- sum(ser.diffX[[i]]^2)
}
cmat[i,j] <- cmat[j,i]
}
}
return(cmat)
}
#########################################################
# Modulated realized covariance (Cristensen et al.(2010))
## data: a list of zoos theta: a positive number
## g: a real-valued function on [0,1] (a weight function)
## delta: a positive number
MRC <- function(data,theta,kn,g,delta=0,adj=TRUE){
n.series <- length(data)
#if(missing(theta)&&missing(kn))
# theta <- selectParam.pavg(data,utime=utime,a.theta=151/80640,
# b.theta=1/96,c.theta=1/6)
if(missing(theta)) theta <- 1
cmat <- matrix(0, n.series, n.series) # cov
# synchronize the data and take the differences
#diffX <- lapply(lapply(refresh_sampling(data),"as.numeric"),"diff")
#diffX <- do.call("rbind",diffX) # transform to matrix
diffX <- diff(do.call("cbind",lapply(refresh_sampling(data),"as.numeric")))
#Num <- ncol(diffX)
Num <- nrow(diffX)
if(missing(kn)) kn <- floor(mean(theta)*Num^(1/2+delta))
kn <- min(max(kn,2),Num+1)
weight <- sapply((1:(kn-1))/kn,g)
psi2.kn <- sum(weight^2)
# pre-averaging
#myfunc <- function(dx)rollapplyr(dx,width=kn-1,FUN="%*%",weight)
#barX <- apply(diffX,1,FUN=myfunc)
barX <- filter(diffX,filter=rev(weight),method="c",sides=1)[(kn-1):Num,]
cmat <- (Num/(Num-kn+2))*t(barX)%*%barX/psi2.kn
if(delta==0){
psi1.kn <- kn^2*sum(diff(c(0,weight,0))^2)
scale <- psi1.kn/(theta^2*psi2.kn*2*Num)
#cmat <- cmat-scale*diffX%*%t(diffX)
cmat <- cmat-scale*t(diffX)%*%diffX
if(adj) cmat <- cmat/(1-scale)
}
return(cmat)
}
#########################################################
# Pre-averaged Hayashi-Yoshida estimator
## data: a list of zoos theta: a positive number
## g: a real-valued function on [0,1] (a weight function)
## refreshing: a logical value (if TRUE we use the refreshed data)
PHY <- function(data,theta,kn,g,refreshing=TRUE,cwise=TRUE){
n.series <- length(data)
#if(missing(theta)&&missing(kn))
# theta <- selectParam.pavg(data,a.theta=7585/1161216,
# b.theta=151/20160,c.theta=1/24)
if(missing(theta)) theta <- 0.15
cmat <- matrix(0, n.series, n.series) # cov
if(refreshing){
if(cwise){
if(missing(kn)){# refreshing,cwise,missing kn
theta <- matrix(theta,n.series,n.series)
theta <- (theta+t(theta))/2
for(i in 1:n.series){
for(j in i:n.series){
if(i!=j){
resample <- refresh_sampling.PHY(list(data[[i]],data[[j]]))
dat <- resample$data
ser.numX <- length(resample$refresh.times)-1
# set data and time index
ser.X <- lapply(dat,"as.numeric")
ser.times <- lapply(lapply(dat,"time"),"as.numeric")
# set difference of the data
ser.diffX <- lapply(ser.X,"diff")
# pre-averaging
kn <- min(max(ceiling(theta[i,j]*sqrt(ser.numX)),2),ser.numX)
weight <- sapply((1:(kn-1))/kn,g)
psi.kn <- sum(weight)
#ser.barX <- list(rollapplyr(ser.diffX[[1]],width=kn-1,FUN="%*%",weight),
# rollapplyr(ser.diffX[[2]],width=kn-1,FUN="%*%",weight))
ser.barX <- list(filter(ser.diffX[[1]],rev(weight),method="c",
sides=1)[(kn-1):length(ser.diffX[[1]])],
filter(ser.diffX[[2]],rev(weight),method="c",
sides=1)[(kn-1):length(ser.diffX[[2]])])
ser.num.barX <- sapply(ser.barX,"length")-1
# core part of cce
#start <- kn+1
#end <- 1
#for(k in 1:ser.num.barX[1]){
# while(!(ser.times[[1]][k]<ser.times[[2]][start])&&((start-kn)<ser.num.barX[2])){
# start <- start + 1
# }
# while((ser.times[[1]][k+kn]>ser.times[[2]][end+1])&&(end<ser.num.barX[2])){
# end <- end + 1
# }
# cmat[i,j] <- cmat[i,j] + ser.barX[[1]][k]*sum(ser.barX[[2]][(start-kn):end])
#}
cmat[i,j] <- .C("pHayashiYoshida",
as.integer(kn),
as.integer(ser.num.barX[1]),
as.integer(ser.num.barX[2]),
as.double(ser.times[[1]]),
as.double(ser.times[[2]]),
as.double(ser.barX[[1]]),
as.double(ser.barX[[2]]),
value=double(1),
PACKAGE = "yuima")$value
cmat[i,j] <- cmat[i,j]/(psi.kn^2)
cmat[j,i] <- cmat[i,j]
}else{
diffX <- diff(as.numeric(data[[i]]))
kn <- min(max(ceiling(theta[i,i]*sqrt(length(diffX))),2),
length(data[[i]]))
weight <- sapply((1:(kn-1))/kn,g)
psi.kn <- sum(weight)
#barX <- rollapplyr(diffX,width=kn-1,FUN="%*%",weight)
barX <- filter(diffX,rev(weight),method="c",
sides=1)[(kn-1):length(diffX)]
tmp <- barX[-length(barX)]
#cmat[i,j] <- tmp%*%rollapply(tmp,width=2*(kn-1)+1,FUN="sum",partial=TRUE)/(psi.kn)^2
cmat[i,j] <- tmp%*%rollsum(c(double(kn-1),tmp,double(kn-1)),
k=2*(kn-1)+1)/(psi.kn)^2
}
}
}
}else{# refreshing,cwise,not missing kn
kn <- matrix(kn,n.series,n.series)
for(i in 1:n.series){
for(j in i:n.series){
if(i!=j){
resample <- refresh_sampling.PHY(list(data[[i]],data[[j]]))
dat <- resample$data
ser.numX <- length(resample$refresh.times)-1
# set data and time index
ser.X <- lapply(dat,"as.numeric")
ser.times <- lapply(lapply(dat,"time"),"as.numeric")
# set difference of the data
ser.diffX <- lapply(ser.X,"diff")
# pre-averaging
knij <- min(max(kn[i,j],2),ser.numX+1)
weight <- sapply((1:(knij-1))/knij,g)
psi.kn <- sum(weight)
#ser.barX <- list(rollapplyr(ser.diffX[[1]],width=knij-1,FUN="%*%",weight),
# rollapplyr(ser.diffX[[2]],width=knij-1,FUN="%*%",weight))
ser.barX <- list(filter(ser.diffX[[1]],rev(weight),method="c",
sides=1)[(knij-1):length(ser.diffX[[1]])],
filter(ser.diffX[[2]],rev(weight),method="c",
sides=1)[(knij-1):length(ser.diffX[[2]])])
ser.num.barX <- sapply(ser.barX,"length")-1
# core part of cce
#start <- knij+1
#end <- 1
#for(k in 1:ser.num.barX[1]){
# while(!(ser.times[[1]][k]<ser.times[[2]][start])&&((start-knij)<ser.num.barX[2])){
# start <- start + 1
# }
# while((ser.times[[1]][k+knij]>ser.times[[2]][end+1])&&(end<ser.num.barX[2])){
# end <- end + 1
# }
# cmat[i,j] <- cmat[i,j] + ser.barX[[1]][k]*sum(ser.barX[[2]][(start-knij):end])
#}
cmat[i,j] <- .C("pHayashiYoshida",
as.integer(knij),
as.integer(ser.num.barX[1]),
as.integer(ser.num.barX[2]),
as.double(ser.times[[1]]),
as.double(ser.times[[2]]),
as.double(ser.barX[[1]]),
as.double(ser.barX[[2]]),
value=double(1),
PACKAGE = "yuima")$value
cmat[i,j] <- cmat[i,j]/(psi.kn^2)
cmat[j,i] <- cmat[i,j]
}else{
diffX <- diff(as.numeric(data[[i]]))
# pre-averaging
kni <- min(max(kn[i,i],2),length(data[[i]]))
weight <- sapply((1:(kni-1))/kni,g)
psi.kn <- sum(weight)
#barX <- rollapplyr(diffX,width=kni-1,FUN="%*%",weight)
barX <- filter(diffX,rev(weight),method="c",
sides=1)[(kni-1):length(diffX)]
tmp <- barX[-length(barX)]
# core part of cce
#cmat[i,j] <- tmp%*%rollapply(tmp,width=2*(kni-1)+1,FUN="sum",partial=TRUE)/(psi.kn)^2
cmat[i,j] <- tmp%*%rollsum(c(double(kni-1),tmp,double(kni-1)),
k=2*(kni-1)+1)/(psi.kn)^2
}
}
}
}
}else{# refreshing,non-cwise
# synchronize the data
resample <- refresh_sampling.PHY(data)
data <- resample$data
ser.numX <- length(resample$refresh.times)-1
# if missing kn, we choose it following Barndorff-Nielsen et al. (2011)
if(missing(kn)){
kn <- min(max(ceiling(mean(theta)*sqrt(ser.numX)),2),ser.numX+1)
}
kn <- kn[1]
weight <- sapply((1:(kn-1))/kn,g)
# allocate memory
ser.X <- vector(n.series, mode="list") # data in 'x'
ser.times <- vector(n.series, mode="list") # time index in 'x'
ser.diffX <- vector(n.series, mode="list") # difference of data
ser.barX <- vector(n.series, mode="list") # pre-averaged data
ser.num.barX <- integer(n.series)
for(i in 1:n.series){
# set data and time index
ser.X[[i]] <- as.numeric(data[[i]]) # we need to transform data into numeric to avoid problem with duplicated indexes below
ser.times[[i]] <- as.numeric(time(data[[i]]))
# set difference of the data
ser.diffX[[i]] <- diff( ser.X[[i]] )
# pre-averaging
#ser.barX[[i]] <- rollapplyr(ser.diffX[[i]],width=kn-1,FUN="%*%",weight)
ser.barX[[i]] <- filter(ser.diffX[[i]],rev(weight),method="c",
sides=1)[(kn-1):length(ser.diffX[[i]])]
ser.num.barX[i] <- length(ser.barX[[i]])-1
}
# core part of cce
for(i in 1:n.series){
for(j in i:n.series){
if(i!=j){
#start <- kn+1
#end <- 1
#for(k in 1:ser.num.barX[i]){
# while(!(ser.times[[i]][k]<ser.times[[j]][start])&&((start-kn)<ser.num.barX[j])){
# start <- start + 1
# }
# while((ser.times[[i]][k+kn]>ser.times[[j]][end+1])&&(end<ser.num.barX[j])){
# end <- end + 1
# }
# cmat[i,j] <- cmat[i,j] + ser.barX[[i]][k]*sum(ser.barX[[j]][(start-kn):end])
#}
cmat[i,j] <- .C("pHayashiYoshida",
as.integer(kn),
as.integer(ser.num.barX[i]),
as.integer(ser.num.barX[j]),
as.double(ser.times[[i]]),
as.double(ser.times[[j]]),
as.double(ser.barX[[i]]),
as.double(ser.barX[[j]]),
value=double(1),
PACKAGE = "yuima")$value
cmat[j,i] <- cmat[i,j]
}else{
tmp <- ser.barX[[i]][1:ser.num.barX[i]]
#cmat[i,j] <- tmp%*%rollapply(tmp,width=2*(kn-1)+1,FUN="sum",partial=TRUE)
cmat[i,j] <- tmp%*%rollsum(c(double(kn-1),tmp,double(kn-1)),
k=2*(kn-1)+1)
}
}
}
psi.kn <- sum(weight)
cmat <- cmat/(psi.kn^2)
}
}else{# non-refreshing
if(cwise){# non-refreshing,cwise
theta <- matrix(theta,n.series,n.series)
theta <- (theta+t(theta))/2
if(missing(kn)){
ntmp <- matrix(sapply(data,"length"),n.series,n.series)
ntmp <- ntmp+t(ntmp)
diag(ntmp) <- diag(ntmp)/2
kn <- ceiling(theta*sqrt(ntmp))
kn[kn<2] <- 2 # kn must be larger than 1
}
kn <- matrix(kn,n.series,n.series)
for(i in 1:n.series){
for(j in i:n.series){
if(i!=j){
dat <- list(data[[i]],data[[j]])
# set data and time index
ser.X <- lapply(dat,"as.numeric")
ser.times <- lapply(lapply(dat,"time"),"as.numeric")
# set difference of the data
ser.diffX <- lapply(ser.X,"diff")
# pre-averaging
knij <- min(kn[i,j],sapply(ser.X,"length")) # kn must be less than the numbers of the observations
weight <- sapply((1:(knij-1))/knij,g)
#ser.barX <- list(rollapplyr(ser.diffX[[1]],width=knij-1,FUN="%*%",weight),
# rollapplyr(ser.diffX[[2]],width=knij-1,FUN="%*%",weight))
ser.barX <- list(filter(ser.diffX[[1]],rev(weight),method="c",
sides=1)[(knij-1):length(ser.diffX[[1]])],
filter(ser.diffX[[2]],rev(weight),method="c",
sides=1)[(knij-1):length(ser.diffX[[2]])])
ser.num.barX <- sapply(ser.barX,"length")-1
psi.kn <- sum(weight)
# core part of cce
start <- knij+1
end <- 1
#for(k in 1:ser.num.barX[1]){
# while(!(ser.times[[1]][k]<ser.times[[2]][start])&&((start-knij)<ser.num.barX[2])){
# start <- start + 1
# }
# while((ser.times[[1]][k+knij]>ser.times[[2]][end+1])&&(end<ser.num.barX[2])){
# end <- end + 1
# }
# cmat[i,j] <- cmat[i,j] + ser.barX[[1]][k]*sum(ser.barX[[2]][(start-knij):end])
#}
cmat[i,j] <- .C("pHayashiYoshida",
as.integer(knij),
as.integer(ser.num.barX[1]),
as.integer(ser.num.barX[2]),
as.double(ser.times[[1]]),
as.double(ser.times[[2]]),
as.double(ser.barX[[1]]),
as.double(ser.barX[[2]]),
value=double(1),
PACKAGE = "yuima")$value
cmat[i,j] <- cmat[i,j]/(psi.kn^2)
cmat[j,i] <- cmat[i,j]
}else{
diffX <- diff(as.numeric(data[[i]]))
# pre-averaging
kni <- min(kn[i,i],length(data[[i]])) # kn must be less than the number of the observations
weight <- sapply((1:(kni-1))/kni,g)
psi.kn <- sum(weight)
#barX <- rollapplyr(diffX,width=kni-1,FUN="%*%",weight)
barX <- filter(diffX,rev(weight),method="c",
sides=1)[(kni-1):length(diffX)]
tmp <- barX[-length(barX)]
#cmat[i,j] <- tmp%*%rollapply(tmp,width=2*(kni-1)+1,FUN="sum",partial=TRUE)/(psi.kn)^2
cmat[i,j] <- tmp%*%rollsum(c(double(kni-1),tmp,double(kni-1)),
k=2*(kni-1)+1)/(psi.kn)^2
}
}
}
}else{# non-refreshing, non-cwise
# allocate memory
ser.X <- vector(n.series, mode="list") # data in 'x'
ser.times <- vector(n.series, mode="list") # time index in 'x'
ser.diffX <- vector(n.series, mode="list") # difference of data
ser.numX <- integer(n.series)
ser.barX <- vector(n.series, mode="list")
for(i in 1:n.series){
# set data and time index
ser.X[[i]] <- as.numeric(data[[i]]) # we need to transform data into numeric to avoid problem with duplicated indexes below
ser.times[[i]] <- as.numeric(time(data[[i]]))
# set difference of the data
ser.diffX[[i]] <- diff( ser.X[[i]] )
ser.numX[i] <- length(ser.diffX[[i]])
}
# pre-averaging
if(missing(kn)){
kn <- min(max(ceiling(mean(theta)*sqrt(sum(ser.numX))),2),
ser.numX+1)
}
kn <- kn[1]
weight <- sapply((1:(kn-1))/kn,g)
psi.kn <- sum(weight)
for(i in 1:n.series){
#ser.barX[[i]] <- rollapplyr(ser.diffX[[i]],width=kn-1,FUN="%*%",weight)
ser.barX[[i]] <- filter(ser.diffX[[i]],rev(weight),method="c",
sides=1)[(kn-1):length(ser.diffX[[i]])]
}
ser.num.barX <- sapply(ser.barX,"length")-1
# core part of cce
cmat <- matrix(0, n.series, n.series) # cov
for(i in 1:n.series){
for(j in i:n.series){
if(i!=j){
#start <- kn+1
#end <- 1
#for(k in 1:ser.num.barX[i]){
# while(!(ser.times[[i]][k]<ser.times[[j]][start])&&((start-kn)<ser.num.barX[j])){
# start <- start + 1
# }
# while((ser.times[[i]][k+kn]>ser.times[[j]][end+1])&&(end<ser.num.barX[j])){
# end <- end + 1
# }
# cmat[i,j] <- cmat[i,j] + ser.barX[[i]][k]*sum(ser.barX[[j]][(start-kn):end])
#}
cmat[i,j] <- .C("pHayashiYoshida",
as.integer(kn),
as.integer(ser.num.barX[i]),
as.integer(ser.num.barX[j]),
as.double(ser.times[[i]]),
as.double(ser.times[[j]]),
as.double(ser.barX[[i]]),
as.double(ser.barX[[j]]),
value=double(1),
PACKAGE = "yuima")$value
cmat[j,i] <- cmat[i,j]
}else{
tmp <- ser.barX[[i]][1:ser.num.barX[i]]
#cmat[i,j] <- tmp%*%rollapply(tmp,width=2*(kn-1)+1,FUN="sum",partial=TRUE)
cmat[i,j] <- tmp%*%rollsum(c(double(kn-1),tmp,double(kn-1)),
k=2*(kn-1)+1)
}
}
}
cmat <- cmat/(psi.kn^2)
}
}
return(cmat)
}
################################################################
# previous tick Two Scales realized CoVariance
## data: a list of zoos c.two: a postive number
TSCV <- function(data,K,c.two,J=1,adj=TRUE,utime){
#X <- do.call("rbind",lapply(refresh_sampling(data),"as.numeric"))
#N <- ncol(X)
X <- do.call("cbind",lapply(refresh_sampling(data),"as.numeric"))
N <- nrow(X)
if(missing(K)){
if(missing(c.two)) c.two <- selectParam.TSCV(data,utime=utime)
K <- ceiling(mean(c.two)*N^(2/3))
}
scale <- (N-K+1)*J/(K*(N-J+1))
#diffX1 <- apply(X,1,"diff",lag=K)
#diffX2 <- apply(X,1,"diff",lag=J)
diffX1 <- diff(X,lag=K)
diffX2 <- diff(X,lag=J)
cmat <- t(diffX1)%*%diffX1/K-scale*t(diffX2)%*%diffX2/J
if(adj) cmat <- cmat/(1-scale)
return(cmat)
}
################################################################
# Generalized multiscale estimator
## data: a list of zoos c.multi: a postive number
GME <- function(data,c.multi,utime){
d.size <- length(data)
if(missing(c.multi)) c.multi <- selectParam.GME(data,utime=utime)
c.multi <- matrix(c.multi,d.size,d.size)
c.multi <- (c.multi+t(c.multi))/2
cmat <- matrix(0,d.size,d.size)
for(i in 1:d.size){
for(j in i:d.size){
if(i!=j){
sdata <- Bibsynchro(data[[i]],data[[j]])
N <- sdata$num.data
M <- ceiling(c.multi[i,j]*sqrt(N))
M <- min(c(M,N)) # M must be smaller than N
M <- max(c(M,2)) # M must be lager than 2
alpha <- 12*(1:M)^2/(M^3-M)-6*(1:M)/(M^2-1)-6*(1:M)/(M^3-M)
#tmp <- double(M)
#for(m in 1:M){
# tmp[m] <- (sdata$xg[m:N]-sdata$xl[1:(N-m+1)])%*%
# (sdata$ygamma[m:N]-sdata$ylambda[1:(N-m+1)])
#}
tmp <- .C("msrc",
as.integer(M),
as.integer(N),
as.double(sdata$xg),
as.double(sdata$xl),
as.double(sdata$ygamma),
as.double(sdata$ylambda),
result=double(M),
PACKAGE = "yuima")$result
cmat[i,j] <- (alpha/(1:M))%*%tmp
}else{
X <- as.numeric(data[[i]])
N <- length(X)-1
M <- ceiling(c.multi[i,j]*sqrt(N))
M <- min(c(M,N)) # M must be smaller than N
M <- max(c(M,2)) # M must be lager than 2
alpha <- 12*(1:M)^2/(M^3-M)-6*(1:M)/(M^2-1)-6*(1:M)/(M^3-M)
#tmp <- double(M)
#for(m in 1:M){
#tmp[m] <- sum((X[m:N]-X[1:(N-m+1)])^2)
# tmp[m] <- sum(diff(X,lag=m)^2)
#}
tmp <- .C("msrc",
as.integer(M),
as.integer(N),
as.double(X[-1]),
as.double(X[1:N]),
as.double(X[-1]),
as.double(X[1:N]),
result=double(M),
PACKAGE = "yuima")$result
cmat[i,j] <- (alpha/(1:M))%*%tmp
}
cmat[j,i] <- cmat[i,j]
}
}
return(cmat)
}
################################################################
# Realized kernel
## data: a list of zoos
## kernel: a real-valued function on [0,infty) (a kernel)
## H: a positive number m: a postive integer
RK <- function(data,kernel,H,c.RK,eta=3/5,m=2,ftregion=0,utime){
# if missing kernel, we use the Parzen kernel
if(missing(kernel)){
kernel <- function(x){
if(x<=1/2){
return(1-6*x^2+6*x^3)
}else if(x<=1){
return(2*(1-x)^3)
}else{
return(0)
}
}
}
d <- length(data)
tmp <- lapply(refresh_sampling(data),"as.numeric")
#tmp <- do.call("rbind",tmp)
tmp <- do.call("cbind",tmp)
#n <- max(c(ncol(tmp)-2*m+1,2))
n <- max(c(nrow(tmp)-2*m+1,2))
# if missing H, we select it following Barndorff-Nielsen et al.(2011)
if(missing(H)){
if(missing(c.RK)) c.RK <- selectParam.RK(data,utime=utime)
H <- mean(c.RK)*n^eta
}
#X <- matrix(0,d,n+1)
X <- matrix(0,n+1,d)
#X[,1] <- apply(matrix(tmp[,1:m],d,m),1,"sum")/m
#X[,1] <- apply(matrix(tmp[,1:m],d,m),1,"mean")
X[1,] <- colMeans(matrix(tmp[1:m,],m,d))
#X[,2:n] <- tmp[,(m+1):(m+n-1)]
X[2:n,] <- tmp[(m+1):(m+n-1),]
#X[,n+1] <- apply(matrix(tmp[,(n+m):(n+2*m-1)],d,m),1,"sum")/m
#X[,n+1] <- apply(matrix(tmp[,(n+m):(n+2*m-1)],d,m),1,"mean")
X[n+1,] <- colMeans(matrix(tmp[(n+m):(n+2*m-1),],m,d))
cc <- floor(ftregion*H) # flat-top region
Kh <- rep(1,cc)
Kh <- append(Kh,sapply(((cc+1):(n-1))/H,kernel))
h.size <- max(which(Kh!=0))
#diffX <- apply(X,1,FUN="diff")
#diffX <- diff(X)
#Gamma <- array(0,dim=c(h.size+1,d,d))
#for(h in 1:(h.size+1))
# Gamma[h,,] <- t(diffX)[,h:n]%*%diffX[1:(n-h+1),]
Gamma <- acf(diff(X),lag.max=h.size,type="covariance",
plot=FALSE,demean=FALSE)$acf*n
cmat <- matrix(0,d,d)
for (i in 1:d){
cmat[,i] <- kernel(0)*Gamma[1,,i]+
Kh[1:h.size]%*%(Gamma[-1,,i]+Gamma[-1,i,])
}
return(cmat)
}
#############################################################
# QMLE (Ait-Sahalia et al.(2010))
## Old sources
if(0){
ql.xiu <- function(zdata){
diffX <- diff(as.numeric(zdata))
inv.difft <- diff(as.numeric(time(zdata)))^(-1)
n <- length(diffX)
a <- 4*inv.difft*sin((pi/2)*seq(1,2*n-1,by=2)/(2*n+1))^2
z <- double(n)
for(k in 1:n){
z[k] <- cos(pi*((2*k-1)/(2*n+1))*(1:n-1/2))%*%diffX
}
z <- sqrt(2/(n+1/2))*z
#z <- sqrt(2/(n+1/2))*cos(pi*((2*(1:n)-1)/(2*n+1))%o%(1:n-1/2))%*%diffX
z2 <- inv.difft*z^2
n.ql <- function(v){
V <- v[1]+a*v[2]
return(sum(log(V)+V^(-1)*z2))
}
gr <- function(v){
V <- v[1]+a*v[2]
obj <- V^(-1)-V^(-2)*z2
return(c(sum(obj),sum(a*obj)))
}
return(list(n.ql=n.ql,gr=gr))
}
cce.qmle <- function(data,opt.method="BFGS",vol.init=NA,
covol.init=NA,nvar.init=NA,ncov.init=NA,...,utime){
d.size <- length(data)
dd <- d.size*(d.size-1)/2
vol.init <- matrix(vol.init,1,d.size)
nvar.init <- matrix(vol.init,1,d.size)
covol.init <- matrix(covol.init,2,dd)
ncov.init <- matrix(ncov.init,2,dd)
if(missing(utime)) utime <- set_utime(data)
cmat <- matrix(0,d.size,d.size)
for(i in 1:d.size){
for(j in i:d.size){
if(i!=j){
idx <- d.size*(i-1)-(i-1)*i/2+(j-i)
dat <- refresh_sampling(list(data[[i]],data[[j]]))
dattime <- apply(do.call("rbind",
lapply(lapply(dat,"time"),"as.numeric")),
2,"max")
dat[[1]] <- zoo(as.numeric(dat[[1]]),dattime)
dat[[2]] <- zoo(as.numeric(dat[[2]]),dattime)
dat1 <- dat[[1]]+dat[[2]]
dat2 <- dat[[1]]-dat[[2]]
ql1 <- ql.xiu(dat1)
ql2 <- ql.xiu(dat2)
Sigma1 <- covol.init[1,idx]
Sigma2 <- covol.init[2,idx]
Omega1 <- ncov.init[1,idx]
Omega2 <- ncov.init[2,idx]
if(is.na(Sigma1)) Sigma1 <- RV.sparse(dat1,frequency=1200,utime=utime)
if(is.na(Sigma2)) Sigma2 <- RV.sparse(dat2,frequency=1200,utime=utime)
if(is.na(Omega1)) Omega1 <- Omega_BNHLS(dat1,sec=120,utime=utime)
if(is.na(Omega2)) Omega2 <- Omega_BNHLS(dat2,sec=120,utime=utime)
#par1 <- optim(par1,fn=ql.ks(dat1),method=opt.method)
#par2 <- optim(par2,fn=ql.ks(dat2),method=opt.method)
par1 <- constrOptim(theta=c(Sigma1,Omega1),
f=ql1$n.ql,grad=ql1$gr,method=opt.method,
ui=diag(2),ci=0,...)$par[1]
par2 <- constrOptim(theta=c(Sigma2,Omega2),
f=ql2$n.ql,grad=ql2$gr,method=opt.method,
ui=diag(2),ci=0,...)$par[1]
cmat[i,j] <- (par1-par2)/4
cmat[j,i] <- cmat[i,j]
}else{
ql <- ql.xiu(data[[i]])
Sigma <- vol.init[i]
Omega <- nvar.init[i]
if(is.na(Sigma)) Sigma <- RV.sparse(data[[i]],frequency=1200,utime=utime)
if(is.na(Omega)) Omega <- Omega_BNHLS(data[[i]],sec=120,utime=utime)
#cmat[i,i] <- optim(par,fn=ql.ks(data[[i]]),method=opt.method)
cmat[i,i] <- constrOptim(theta=c(Sigma,Omega),f=ql$n.ql,grad=ql$gr,
method=opt.method,
ui=diag(2),ci=0,...)$par[1]
}
}
}
return(cmat)
}
}
## New sources (2014/11/10, use arima0)
cce.qmle <- function(data,vol.init=NA,covol.init=NA,nvar.init=NA,ncov.init=NA){
d.size <- length(data)
dd <- d.size*(d.size-1)/2
vol.init <- matrix(vol.init,1,d.size)
nvar.init <- matrix(vol.init,1,d.size)
covol.init <- matrix(covol.init,2,dd)
ncov.init <- matrix(ncov.init,2,dd)
cmat <- matrix(0,d.size,d.size)
for(i in 1:d.size){
for(j in i:d.size){
if(i!=j){
idx <- d.size*(i-1)-(i-1)*i/2+(j-i)
dat <- refresh_sampling(list(data[[i]],data[[j]]))
dat[[1]] <- diff(as.numeric(dat[[1]]))
dat[[2]] <- diff(as.numeric(dat[[2]]))
n <- length(dat[[1]])
Sigma1 <- covol.init[1,idx]
Sigma2 <- covol.init[2,idx]
Omega1 <- ncov.init[1,idx]
Omega2 <- ncov.init[2,idx]
init <- (-2*Omega1-Sigma1/n+sqrt(Sigma1*(4*Omega1+Sigma1/n)/n))/(2*Omega1)
obj <- arima0(dat[[1]]+dat[[2]],order=c(0,0,1),include.mean=FALSE,
init=init)
par1 <- n*obj$sigma2*(1+obj$coef)^2
init <- (-2*Omega2-Sigma2/n+sqrt(Sigma2*(4*Omega2+Sigma2/n)/n))/(2*Omega2)
obj <- arima0(dat[[1]]-dat[[2]],order=c(0,0,1),include.mean=FALSE,
init=init)
par2 <- n*obj$sigma2*(1+obj$coef)^2
cmat[i,j] <- (par1-par2)/4
cmat[j,i] <- cmat[i,j]
}else{
dx <- diff(as.numeric(data[[i]]))
n <- length(dx)
Sigma <- vol.init[i]
Omega <- nvar.init[i]
init <- (-2*Omega-Sigma/n+sqrt(Sigma*(4*Omega+Sigma/n)/n))/(2*Omega)
obj <- arima0(dx,order=c(0,0,1),include.mean=FALSE,init=init)
cmat[i,i] <- n*obj$sigma2*(1+obj$coef)^2
}
}
}
return(cmat)
}
##################################################################
# Separating information maximum likelihood estimator (Kunitomo and Sato (2008))
SIML <- function(data,mn,alpha=0.4){
d.size <- length(data)
data <- lapply(refresh_sampling(data),"as.numeric")
data <- do.call("cbind",data)
n.size <- nrow(data)-1
if(missing(mn)){
mn <- ceiling(n.size^alpha)
}
#C <- matrix(1,n.size,n.size)
#C[upper.tri(C)] <- 0
#P <- matrix(0,n.size,n.size)
#for(j in 1:n.size){
# for(k in 1:n.size){
# P[j,k] <- sqrt(2/(n.size+1/2))*cos((2*pi/(2*n.size+1))*(j-1/2)*(k-1/2))
# }
#}
#Z <- data[-1,]-matrix(1,n.size,1)%*%matrix(data[1,],1,d.size)
#Z <- sqrt(n.size)*t(P)%*%solve(C)%*%Z
#diff.Y <- apply(data,2,"diff")
diff.Y <- diff(data)
#Z <- matrix(0,n.size,d.size)
#for(j in 1:n.size){
# pj <- sqrt(2/(n.size+1/2))*cos((2*pi/(2*n.size+1))*(j-1/2)*(1:n.size-1/2))
# Z[j,] <- matrix(pj,1,n.size)%*%diff.Y
#}
#Z <- matrix(0,mn,d.size)
#for(j in 1:mn){
# pj <- sqrt(2/(n.size+1/2))*cos((2*pi/(2*n.size+1))*(j-1/2)*(1:n.size-1/2))
# Z[j,] <- matrix(pj,1,n.size)%*%diff.Y
#}
#Z <- sqrt(n.size)*Z
Z <- sqrt(n.size)*
sqrt(2/(n.size+1/2))*cos((2*pi/(2*n.size+1))*(1:mn-1/2)%o%(1:n.size-1/2))%*%
diff.Y
cmat <- matrix(0,d.size,d.size)
for(k in 1:mn){
cmat <- cmat+matrix(Z[k,],d.size,1)%*%matrix(Z[k,],1,d.size)
}
return(cmat/mn)
}
#############################################################
# Truncated Hayashi-Yoshida estimator
## data: a list of zoos
## threshold: a numeric vector or a list of numeric vectors or zoos
THY <- function(data,threshold) {
n.series <- length(data)
if(missing(threshold)){
threshold <- local_univ_threshold(data,coef=5,eps=0.1)
}else if(is.numeric(threshold)){
threshold <- matrix(threshold,1,n.series)
}
#if(n.series <2)
# stop("Please provide at least 2-dimensional time series")
# allocate memory
ser.X <- vector(n.series, mode="list") # data in 'x'
ser.times <- vector(n.series, mode="list") # time index in 'x'
ser.diffX <- vector(n.series, mode="list") # difference of data
ser.rho <- vector(n.series, mode="list")
for(i in 1:n.series){
# set data and time index
ser.X[[i]] <- as.numeric(data[[i]]) # we need to transform data into numeric to avoid problem with duplicated indexes below
ser.times[[i]] <- as.numeric(time(data[[i]]))
# set difference of the data with truncation
ser.diffX[[i]] <- diff( ser.X[[i]] )
if(is.numeric(threshold)){
ser.rho[[i]] <- rep(threshold[i],length(ser.diffX[[i]]))
}else{
ser.rho[[i]] <- as.numeric(threshold[[i]])
}
# thresholding
ser.diffX[[i]][ser.diffX[[i]]^2>ser.rho[[i]]] <- 0
}
# core part of cce
cmat <- matrix(0, n.series, n.series) # cov
for(i in 1:n.series){
for(j in i:n.series){
#I <- rep(1,n.series)
#Checking Starting Point
#repeat{
# if(ser.times[[i]][I[i]] >= ser.times[[j]][I[j]+1]){
# I[j] <- I[j]+1
# }else if(ser.times[[i]][I[i]+1] <= ser.times[[j]][I[j]]){
# I[i] <- I[i]+1
# }else{
# break
# }
#}
#Main Component
if(i!=j){
#while((I[i]<length(ser.times[[i]])) && (I[j]<length(ser.times[[j]]))) {
# cmat[j,i] <- cmat[j,i] + (ser.diffX[[i]])[I[i]]*(ser.diffX[[j]])[I[j]]
# if(ser.times[[i]][I[i]+1]>ser.times[[j]][I[j]+1]){
# I[j] <- I[j] + 1
# }else if(ser.times[[i]][I[i]+1]<ser.times[[j]][I[j]+1]){
# I[i] <- I[i] +1
# }else{
# I[i] <- I[i]+1
# I[j] <- I[j]+1
# }
#}
cmat[j,i] <- .C("HayashiYoshida",as.integer(length(ser.times[[i]])),
as.integer(length(ser.times[[j]])),as.double(ser.times[[i]]),
as.double(ser.times[[j]]),as.double(ser.diffX[[i]]),
as.double(ser.diffX[[j]]),value=double(1),
PACKAGE = "yuima")$value
}else{
cmat[i,j] <- sum(ser.diffX[[i]]^2)
}
cmat[i,j] <- cmat[j,i]
}
}
return(cmat)
}
#########################################################
# Pre-averaged truncated Hayashi-Yoshida estimator
## data: a list of zoos theta: a postive number
## g: a real-valued function on [0,1] (a weight function)
## threshold: a numeric vector or a list of numeric vectors or zoos
## refreshing: a logical value (if TRUE we use the refreshed data)
PTHY <- function(data,theta,kn,g,threshold,refreshing=TRUE,
cwise=TRUE,eps=0.2){
n.series <- length(data)
#if(missing(theta)&&missing(kn))
# theta <- selectParam.pavg(data,a.theta=7585/1161216,
# b.theta=151/20160,c.theta=1/24)
if(missing(theta)) theta <- 0.15
cmat <- matrix(0, n.series, n.series) # cov
if(refreshing){
if(cwise){
if(missing(kn)){# refreshing,cwise,missing kn
theta <- matrix(theta,n.series,n.series)
theta <- (theta+t(theta))/2
for(i in 1:n.series){
for(j in i:n.series){
if(i!=j){
resample <- refresh_sampling.PHY(list(data[[i]],data[[j]]))
dat <- resample$data
ser.numX <- length(resample$refresh.times)-1
# set data and time index
ser.X <- lapply(dat,"as.numeric")
ser.times <- lapply(lapply(dat,"time"),"as.numeric")
# set difference of the data
ser.diffX <- lapply(ser.X,"diff")
# pre-averaging
kn <- min(max(ceiling(theta[i,j]*sqrt(ser.numX)),2),ser.numX)
weight <- sapply((1:(kn-1))/kn,g)
psi.kn <- sum(weight)
#ser.barX <- list(rollapplyr(ser.diffX[[1]],width=kn-1,FUN="%*%",weight),
# rollapplyr(ser.diffX[[2]],width=kn-1,FUN="%*%",weight))
ser.barX <- list(filter(ser.diffX[[1]],rev(weight),method="c",
sides=1)[(kn-1):length(ser.diffX[[1]])],
filter(ser.diffX[[2]],rev(weight),method="c",
sides=1)[(kn-1):length(ser.diffX[[2]])])
ser.num.barX <- sapply(ser.barX,"length")
# thresholding
if(missing(threshold)){
for(ii in 1:2){
K <- ceiling(ser.num.barX[ii]^(3/4))
obj0 <- abs(ser.barX[[ii]])
obj1 <- (pi/2)*obj0[1:(ser.num.barX[ii]-kn)]*obj0[-(1:kn)]
if(min(K,ser.num.barX[ii]-1)<2*kn){
#v.hat <- (median(obj0)/0.6745)^2
v.hat <- mean(obj1)
}else{
v.hat <- double(ser.num.barX[ii])
#v.hat[1:K] <- (median(obj0[1:K])/0.6745)^2
v.hat[-(1:K)] <- rollmean(obj1[1:(ser.num.barX[ii]-2*kn)],k=K-2*kn+1,align="left")
v.hat[1:K] <- v.hat[K+1]
}
#rho <- 2*log(ser.num.barX[ii])*
# (median(abs(ser.barX[[ii]])/sqrt(v.hat))/0.6745)^2*v.hat
rho <- 2*log(ser.num.barX[ii])^(1+eps)*v.hat
ser.barX[[ii]][ser.barX[[ii]]^2>rho] <- 0
}
}else if(is.numeric(threshold)){
threshold <- matrix(threshold,1,n.series)
ser.barX[[1]][ser.barX[[1]]^2>threshold[i]] <- 0
ser.barX[[2]][ser.barX[[2]]^2>threshold[j]] <- 0
}else{
ser.barX[[1]][ser.barX[[1]]^2>threshold[[i]][1:ser.num.barX[1]]] <- 0
ser.barX[[2]][ser.barX[[2]]^2>threshold[[j]][1:ser.num.barX[2]]] <- 0
}
ser.num.barX <- ser.num.barX-1
# core part of cce
#start <- kn+1
#end <- 1
#for(k in 1:ser.num.barX[1]){
# while(!(ser.times[[1]][k]<ser.times[[2]][start])&&((start-kn)<ser.num.barX[2])){
# start <- start + 1
# }
# while((ser.times[[1]][k+kn]>ser.times[[2]][end+1])&&(end<ser.num.barX[2])){
# end <- end + 1
# }
# cmat[i,j] <- cmat[i,j] + ser.barX[[1]][k]*sum(ser.barX[[2]][(start-kn):end])
#}
cmat[i,j] <- .C("pHayashiYoshida",
as.integer(kn),
as.integer(ser.num.barX[1]),
as.integer(ser.num.barX[2]),
as.double(ser.times[[1]]),
as.double(ser.times[[2]]),
as.double(ser.barX[[1]]),
as.double(ser.barX[[2]]),
value=double(1),
PACKAGE = "yuima")$value
cmat[i,j] <- cmat[i,j]/(psi.kn^2)
cmat[j,i] <- cmat[i,j]
}else{
diffX <- diff(as.numeric(data[[i]]))
# pre-averaging
kn <- min(max(ceiling(theta[i,i]*sqrt(length(diffX))),2),
length(data[[i]]))
weight <- sapply((1:(kn-1))/kn,g)
psi.kn <- sum(weight)
#barX <- rollapplyr(diffX,width=kn-1,FUN="%*%",weight)
barX <- filter(diffX,rev(weight),method="c",
sides=1)[(kn-1):length(diffX)]
num.barX <- length(barX)
# thresholding
if(missing(threshold)){
K <- ceiling(num.barX^(3/4))
#K <- ceiling(kn^(3/2))
obj0 <- abs(barX)
obj1 <- (pi/2)*obj0[1:(num.barX-kn)]*obj0[-(1:kn)]
if(min(K,num.barX-1)<2*kn){
#v.hat <- (median(obj0)/0.6745)^2
v.hat <- mean(obj1)
}else{
v.hat <- double(num.barX)
#v.hat[1:K] <- (median(obj0[1:K])/0.6745)^2
v.hat[-(1:K)] <- rollmean(obj1[1:(num.barX-2*kn)],k=K-2*kn+1,align="left")
v.hat[1:K] <- v.hat[K+1]
}
#rho <- 2*log(num.barX)*
# (median(abs(barX)/sqrt(v.hat))/0.6745)^2*v.hat
rho <- 2*log(num.barX)^(1+eps)*v.hat
barX[barX^2>rho] <- 0
}else if(is.numeric(threshold)){
threshold <- matrix(threshold,1,n.series)
barX[barX^2>threshold[i]] <- 0
}else{
barX[barX^2>threshold[[i]][1:num.barX]] <- 0
}
tmp <- barX[-num.barX]
#cmat[i,j] <- tmp%*%rollapply(tmp,width=2*(kn-1)+1,FUN="sum",partial=TRUE)/(psi.kn)^2
cmat[i,j] <- tmp%*%rollsum(c(double(kn-1),tmp,double(kn-1)),
k=2*(kn-1)+1)/(psi.kn)^2
}
}
}
}else{# refreshing,cwise,not missing kn
kn <- matrix(kn,n.series,n.series)
for(i in 1:n.series){
for(j in i:n.series){
if(i!=j){
resample <- refresh_sampling.PHY(list(data[[i]],data[[j]]))
dat <- resample$data
ser.numX <- length(resample$refresh.times)-1
knij <- min(max(kn[i,j],2),ser.numX+1)
weight <- sapply((1:(knij-1))/knij,g)
psi.kn <- sum(weight)
# set data and time index
ser.X <- lapply(dat,"as.numeric")
ser.times <- lapply(lapply(dat,"time"),"as.numeric")
# set difference of the data
ser.diffX <- lapply(ser.X,"diff")
# pre-averaging
#ser.barX <- list(rollapplyr(ser.diffX[[1]],width=knij-1,FUN="%*%",weight),
# rollapplyr(ser.diffX[[2]],width=knij-1,FUN="%*%",weight))
ser.barX <- list(filter(ser.diffX[[1]],rev(weight),method="c",
sides=1)[(knij-1):length(ser.diffX[[1]])],
filter(ser.diffX[[2]],rev(weight),method="c",
sides=1)[(knij-1):length(ser.diffX[[2]])])
ser.num.barX <- sapply(ser.barX,"length")
# thresholding
if(missing(threshold)){
for(ii in 1:2){
K <- ceiling(ser.num.barX[ii]^(3/4))
obj0 <- abs(ser.barX[[ii]])
obj1 <- (pi/2)*obj0[1:(ser.num.barX[ii]-knij)]*obj0[-(1:knij)]
if(min(K,ser.num.barX[ii]-1)<2*knij){
#v.hat <- (median(obj0)/0.6745)^2
v.hat <- mean(obj1)
}else{
v.hat <- double(ser.num.barX[ii])
#v.hat[1:K] <- (median(obj0[1:K])/0.6745)^2
v.hat[-(1:K)] <- rollmean(obj1[1:(ser.num.barX[ii]-2*knij)],k=K-2*knij+1,align="left")
v.hat[1:K] <- v.hat[K+1]
}
#rho <- 2*log(ser.num.barX[ii])*
# (median(abs(ser.barX[[ii]])/sqrt(v.hat))/0.6745)^2*v.hat
rho <- 2*log(ser.num.barX[ii])^(1+eps)*v.hat
ser.barX[[ii]][ser.barX[[ii]]^2>rho] <- 0
}
}else if(is.numeric(threshold)){
threshold <- matrix(threshold,1,n.series)
ser.barX[[1]][ser.barX[[1]]^2>threshold[i]] <- 0
ser.barX[[2]][ser.barX[[2]]^2>threshold[j]] <- 0
}else{
ser.barX[[1]][ser.barX[[1]]^2>threshold[[i]][1:ser.num.barX[1]]] <- 0
ser.barX[[2]][ser.barX[[2]]^2>threshold[[j]][1:ser.num.barX[2]]] <- 0
}
ser.num.barX <- ser.num.barX-1
# core part of cce
#start <- knij+1
#end <- 1
#for(k in 1:ser.num.barX[1]){
# while(!(ser.times[[1]][k]<ser.times[[2]][start])&&((start-knij)<ser.num.barX[2])){
# start <- start + 1
# }
# while((ser.times[[1]][k+knij]>ser.times[[2]][end+1])&&(end<ser.num.barX[2])){
# end <- end + 1
# }
# cmat[i,j] <- cmat[i,j] + ser.barX[[1]][k]*sum(ser.barX[[2]][(start-knij):end])
#}
cmat[i,j] <- .C("pHayashiYoshida",
as.integer(knij),
as.integer(ser.num.barX[1]),
as.integer(ser.num.barX[2]),
as.double(ser.times[[1]]),
as.double(ser.times[[2]]),
as.double(ser.barX[[1]]),
as.double(ser.barX[[2]]),
value=double(1),
PACKAGE = "yuima")$value
cmat[i,j] <- cmat[i,j]/(psi.kn^2)
cmat[j,i] <- cmat[i,j]
}else{
diffX <- diff(as.numeric(data[[i]]))
# pre-averaging
kni <- min(max(kni,2),length(data[[i]]))
weight <- sapply((1:(kni-1))/kni,g)
psi.kn <- sum(weight)
#barX <- rollapplyr(diffX,width=kni-1,FUN="%*%",weight)
barX <- filter(diffX,rev(weight),method="c",
sides=1)[(kni-1):length(diffX)]
num.barX <- length(barX)
# thresholding
if(missing(threshold)){
K <- ceiling(num.barX^(3/4))
#K <- ceiling(kn^(3/2))
obj0 <- abs(barX)
obj1 <- (pi/2)*obj0[1:(num.barX-kni)]*obj0[-(1:kni)]
if(min(K,num.barX-1)<2*kni){
#v.hat <- (median(obj0)/0.6745)^2
v.hat <- mean(obj1)
}else{
v.hat <- double(num.barX)
#v.hat[1:K] <- (median(obj0[1:K])/0.6745)^2
v.hat[-(1:K)] <- rollmean(obj1[1:(num.barX-2*kni)],k=K-2*kni+1,align="left")
v.hat[1:K] <- v.hat[K+1]
}
#rho <- 2*log(num.barX)*
# (median(abs(barX)/sqrt(v.hat))/0.6745)^2*v.hat
rho <- 2*log(num.barX)^(1+eps)*v.hat
barX[barX^2>rho] <- 0
}else if(is.numeric(threshold)){
threshold <- matrix(threshold,1,n.series)
barX[barX^2>threshold[i]] <- 0
}else{
barX[barX^2>threshold[[i]][1:num.barX]] <- 0
}
tmp <- barX[-num.barX]
#cmat[i,j] <- tmp%*%rollapply(tmp,width=2*(kni-1)+1,FUN="sum",partial=TRUE)/(psi.kn)^2
cmat[i,j] <- tmp%*%rollsum(c(double(kni-1),tmp,double(kni-1)),
k=2*(kni-1)+1)/(psi.kn)^2
}
}
}
}
}else{# refreshing,non-cwise
# synchronize the data
resample <- refresh_sampling.PHY(data)
data <- resample$data
ser.numX <- length(resample$refresh.times)-1
# if missing kn, we choose it following Barndorff-Nielsen et al. (2011)
if(missing(kn)){
kn <- min(max(ceiling(mean(theta)*sqrt(ser.numX)),2),ser.numX+1)
}
kn <- kn[1]
weight <- sapply((1:(kn-1))/kn,g)
# allocate memory
ser.X <- vector(n.series, mode="list") # data in 'x'
ser.times <- vector(n.series, mode="list") # time index in 'x'
ser.diffX <- vector(n.series, mode="list") # difference of data
ser.barX <- vector(n.series, mode="list") # pre-averaged data
ser.num.barX <- integer(n.series)
for(i in 1:n.series){
# set data and time index
ser.X[[i]] <- as.numeric(data[[i]]) # we need to transform data into numeric to avoid problem with duplicated indexes below
ser.times[[i]] <- as.numeric(time(data[[i]]))
# set difference of the data
ser.diffX[[i]] <- diff( ser.X[[i]] )
}
# thresholding
if(missing(threshold)){
#coef <- 2*coef*kn/sqrt(ser.numX)
for(i in 1:n.series){
#ser.num.barX[i] <- ser.numX[i]-kn+2
#ser.barX[[i]] <- double(ser.num.barX[i])
#for(j in 1:ser.num.barX[i]){
# ser.barX[[i]][j] <- sapply((1:(kn-1))/kn,g)%*%ser.diffX[[i]][j:(j+kn-2)]
#}
#ser.barX[[i]] <- rollapplyr(ser.diffX[[i]],width=kn-1,FUN="%*%",weight)
ser.barX[[i]] <- filter(ser.diffX[[i]],rev(weight),method="c",
sides=1)[(kn-1):length(ser.diffX[[i]])]
ser.num.barX[i] <- length(ser.barX[[i]])
K <- ceiling(ser.num.barX[i]^(3/4))
obj0 <- abs(ser.barX[[i]])
obj1 <- (pi/2)*obj0[1:(ser.num.barX[i]-kn)]*obj0[-(1:kn)]
if(min(K,ser.num.barX[i]-1)<2*kn){
#v.hat <- (median(obj0)/0.6745)^2
v.hat <- mean(obj1)
}else{
v.hat <- double(ser.num.barX[i])
#v.hat[1:K] <- (median(obj0[1:K])/0.6745)^2
v.hat[-(1:K)] <- rollmean(obj1[1:(ser.num.barX[i]-2*kn)],
k=K-2*kn+1,align="left")
v.hat[1:K] <- v.hat[K+1]
}
#rho <- 2*log(ser.num.barX[ii])*
# (median(abs(ser.barX[[ii]])/sqrt(v.hat))/0.6745)^2*v.hat
rho <- 2*log(ser.num.barX[i])^(1+eps)*v.hat
ser.barX[[i]][ser.barX[[i]]^2>rho] <- 0
}
}else if(is.numeric(threshold)){
threshold <- matrix(threshold,1,n.series)
for(i in 1:n.series){
#ser.num.barX[i] <- ser.numX[i]-kn+2
#ser.barX[[i]] <- double(ser.num.barX[i])
#for(j in 1:ser.num.barX[i]){
# tmp <- sapply((1:(kn-1))/kn,g)%*%ser.diffX[[i]][j:(j+kn-2)]
# if(tmp^2>threshold[i]){
# ser.barX[[i]][j] <- 0
# }else{
# ser.barX[[i]][j] <- tmp
# }
#}
#ser.barX[[i]] <- rollapplyr(ser.diffX[[i]],width=kn-1,FUN="%*%",weight)
ser.barX[[i]] <- filter(ser.diffX[[i]],rev(weight),method="c",
sides=1)[(kn-1):length(ser.diffX[[i]])]
ser.num.barX[i] <- length(ser.barX[[i]])
ser.barX[[i]][ser.barX[[i]]^2>threshold[i]] <- 0
}
}else{
for(i in 1:n.series){
#ser.num.barX[i] <- ser.numX[i]-kn+2
#ser.barX[[i]] <- double(ser.num.barX[i])
#for(j in 1:ser.num.barX[i]){
# tmp <- sapply((1:(kn-1))/kn,g)%*%ser.diffX[[i]][j:(j+kn-2)]
# if(tmp^2>threshold[[i]][j]){
# ser.barX[[i]][j] <- 0
# }else{
# ser.barX[[i]][j] <- tmp
# }
#}
#ser.barX[[i]] <- rollapplyr(ser.diffX[[i]],width=kn-1,FUN="%*%",weight)
ser.barX[[i]] <- filter(ser.diffX[[i]],rev(weight),method="c",
sides=1)[(kn-1):length(ser.diffX[[i]])]
ser.num.barX[i] <- length(ser.barX[[i]])
ser.barX[[i]][ser.barX[[i]]^2>threshold[[i]][1:ser.num.barX[i]]] <- 0
}
}
ser.num.barX <- ser.num.barX-1
# core part of cce
for(i in 1:n.series){
for(j in i:n.series){
if(i!=j){
#start <- kn+1
#end <- 1
#for(k in 1:ser.num.barX[i]){
# while(!(ser.times[[i]][k]<ser.times[[j]][start])&&((start-kn)<ser.num.barX[j])){
# start <- start + 1
# }
# while((ser.times[[i]][k+kn]>ser.times[[j]][end+1])&&(end<ser.num.barX[j])){
# end <- end + 1
# }
# cmat[i,j] <- cmat[i,j] + ser.barX[[i]][k]*sum(ser.barX[[j]][(start-kn):end])
#}
cmat[i,j] <- .C("pHayashiYoshida",
as.integer(kn),
as.integer(ser.num.barX[i]),
as.integer(ser.num.barX[j]),
as.double(ser.times[[i]]),
as.double(ser.times[[j]]),
as.double(ser.barX[[i]]),
as.double(ser.barX[[j]]),
value=double(1),
PACKAGE = "yuima")$value
cmat[j,i] <- cmat[i,j]
}else{
tmp <- ser.barX[[i]][1:ser.num.barX[i]]
#cmat[i,j] <- tmp%*%rollapply(tmp,width=2*(kn-1)+1,FUN="sum",partial=TRUE)
cmat[i,j] <- tmp%*%rollsum(c(double(kn-1),tmp,double(kn-1)),
k=2*(kn-1)+1)
}
}
}
psi.kn <- sum(weight)
cmat <- cmat/(psi.kn^2)
}
}else{# non-refreshing
if(cwise){# non-refreshing,cwise
theta <- matrix(theta,n.series,n.series)
theta <- (theta+t(theta))/2
if(missing(kn)){
ntmp <- matrix(sapply(data,"length"),n.series,n.series)
ntmp <- ntmp+t(ntmp)
diag(ntmp) <- diag(ntmp)/2
kn <- ceiling(theta*sqrt(ntmp))
kn[kn<2] <- 2 # kn must be larger than 1
}
kn <- matrix(kn,n.series,n.series)
for(i in 1:n.series){
for(j in i:n.series){
if(i!=j){
dat <- list(data[[i]],data[[j]])
# set data and time index
ser.X <- lapply(dat,"as.numeric")
ser.times <- lapply(lapply(dat,"time"),"as.numeric")
# set difference of the data
ser.diffX <- lapply(ser.X,"diff")
# pre-averaging
knij <- min(kn[i,j],sapply(ser.X,"length")) # kn must be less than the numbers of the observations
weight <- sapply((1:(knij-1))/knij,g)
psi.kn <- sum(weight)
#ser.barX <- list(rollapplyr(ser.diffX[[1]],width=knij-1,FUN="%*%",weight),
# rollapplyr(ser.diffX[[2]],width=knij-1,FUN="%*%",weight))
ser.barX <- list(filter(ser.diffX[[1]],rev(weight),method="c",
sides=1)[(knij-1):length(ser.diffX[[1]])],
filter(ser.diffX[[2]],rev(weight),method="c",
sides=1)[(knij-1):length(ser.diffX[[2]])])
ser.num.barX <- sapply(ser.barX,"length")
# thresholding
if(missing(threshold)){
for(ii in 1:2){
K <- ceiling(ser.num.barX[ii]^(3/4))
obj0 <- abs(ser.barX[[ii]])
obj1 <- (pi/2)*obj0[1:(ser.num.barX[ii]-knij)]*obj0[-(1:knij)]
if(min(K,ser.num.barX[ii]-1)<2*knij){
#v.hat <- (median(obj0)/0.6745)^2
v.hat <- mean(obj1)
}else{
v.hat <- double(ser.num.barX[ii])
#v.hat[1:K] <- (median(obj0[1:K])/0.6745)^2
v.hat[-(1:K)] <- rollmean(obj1[1:(ser.num.barX[ii]-2*knij)],k=K-2*knij+1,align="left")
v.hat[1:K] <- v.hat[K+1]
}
#rho <- 2*log(ser.num.barX[ii])*
# (median(abs(ser.barX[[ii]])/sqrt(v.hat))/0.6745)^2*v.hat
rho <- 2*log(ser.num.barX[ii])^(1+eps)*v.hat
ser.barX[[ii]][ser.barX[[ii]]^2>rho] <- 0
}
}else if(is.numeric(threshold)){
threshold <- matrix(threshold,1,n.series)
ser.barX[[1]][ser.barX[[1]]^2>threshold[i]] <- 0
ser.barX[[2]][ser.barX[[2]]^2>threshold[j]] <- 0
}else{
ser.barX[[1]][ser.barX[[1]]^2>threshold[[i]][1:ser.num.barX[1]]] <- 0
ser.barX[[2]][ser.barX[[2]]^2>threshold[[j]][1:ser.num.barX[2]]] <- 0
}
ser.num.barX <- ser.num.barX-1
# core part of cce
#start <- knij+1
#end <- 1
#for(k in 1:ser.num.barX[1]){
# while(!(ser.times[[1]][k]<ser.times[[2]][start])&&((start-knij)<ser.num.barX[2])){
# start <- start + 1
# }
# while((ser.times[[1]][k+knij]>ser.times[[2]][end+1])&&(end<ser.num.barX[2])){
# end <- end + 1
# }
# cmat[i,j] <- cmat[i,j] + ser.barX[[1]][k]*sum(ser.barX[[2]][(start-knij):end])
#}
cmat[i,j] <- .C("pHayashiYoshida",
as.integer(knij),
as.integer(ser.num.barX[1]),
as.integer(ser.num.barX[2]),
as.double(ser.times[[1]]),
as.double(ser.times[[2]]),
as.double(ser.barX[[1]]),
as.double(ser.barX[[2]]),
value=double(1),
PACKAGE = "yuima")$value
cmat[i,j] <- cmat[i,j]/(psi.kn^2)
cmat[j,i] <- cmat[i,j]
}else{
diffX <- diff(as.numeric(data[[i]]))
# pre-averaging
kni <- min(kn[i,i],length(data[[i]])) # kn must be less than the number of the observations
weight <- sapply((1:(kni-1))/kni,g)
psi.kn <- sum(weight)
#barX <- rollapplyr(diffX,width=kni-1,FUN="%*%",weight)
barX <- filter(diffX,rev(weight),method="c",
sides=1)[(kni-1):length(diffX)]
num.barX <- length(barX)
# thrsholding
if(missing(threshold)){
K <- ceiling(num.barX^(3/4))
#K <- ceiling(kn^(3/2))
obj0 <- abs(barX)
obj1 <- (pi/2)*obj0[1:(num.barX-kni)]*obj0[-(1:kni)]
if(min(K,num.barX-1)<2*kni){
#v.hat <- (median(obj0)/0.6745)^2
v.hat <- mean(obj1)
}else{
v.hat <- double(num.barX)
#v.hat[1:K] <- (median(obj0[1:K])/0.6745)^2
v.hat[-(1:K)] <- rollmean(obj1[1:(num.barX-2*kni)],k=K-2*kni+1,align="left")
v.hat[1:K] <- v.hat[K+1]
}
#rho <- 2*log(num.barX)*
# (median(abs(barX)/sqrt(v.hat))/0.6745)^2*v.hat
rho <- 2*log(num.barX)^(1+eps)*v.hat
barX[barX^2>rho] <- 0
}else if(is.numeric(threshold)){
threshold <- matrix(threshold,1,n.series)
barX[barX^2>threshold[i]] <- 0
}else{
barX[barX^2>threshold[[i]][1:num.barX]] <- 0
}
tmp <- barX[-num.barX]
#cmat[i,j] <- tmp%*%rollapply(tmp,width=2*(kni-1)+1,FUN="sum",partial=TRUE)/(psi.kn)^2
cmat[i,j] <- tmp%*%rollsum(c(double(kni-1),tmp,double(kni-1)),
k=2*(kni-1)+1)/(psi.kn)^2
}
}
}
}else{# non-refreshing, non-cwise
# allocate memory
ser.X <- vector(n.series, mode="list") # data in 'x'
ser.times <- vector(n.series, mode="list") # time index in 'x'
ser.diffX <- vector(n.series, mode="list") # difference of data
ser.numX <- integer(n.series)
ser.barX <- vector(n.series, mode="list")
for(i in 1:n.series){
# set data and time index
ser.X[[i]] <- as.numeric(data[[i]]) # we need to transform data into numeric to avoid problem with duplicated indexes below
ser.times[[i]] <- as.numeric(time(data[[i]]))
# set difference of the data
ser.diffX[[i]] <- diff( ser.X[[i]] )
ser.numX[i] <- length(ser.diffX[[i]])
}
# if missing kn, we select it following Barndorff-Nielsen et al.(2011)
if(missing(kn)){
kn <- min(max(ceiling(mean(theta)*sqrt(sum(ser.numX))),2),
ser.numX+1)
}
kn <- kn[1]
weight <- sapply((1:(kn-1))/kn,g)
psi.kn <- sum(weight)
ser.num.barX <- integer(n.series)
# pre-averaging and thresholding
if(missing(threshold)){
for(i in 1:n.series){
#ser.barX[[i]] <- rollapplyr(ser.diffX[[i]],width=kn-1,FUN="%*%",weight)
ser.barX[[i]] <- filter(ser.diffX[[i]],rev(weight),method="c",
sides=1)[(kn-1):length(ser.diffX[[i]])]
ser.num.barX[i] <- length(ser.barX[[i]])
K <- ceiling(ser.num.barX[i]^(3/4))
obj0 <- abs(ser.barX[[i]])
obj1 <- (pi/2)*obj0[1:(ser.num.barX[i]-kn)]*obj0[-(1:kn)]
if(min(K,ser.num.barX[i]-1)<2*kn){
#v.hat <- (median(obj0)/0.6745)^2
v.hat <- mean(obj1)
}else{
v.hat <- double(ser.num.barX[i])
#v.hat[1:K] <- (median(obj0[1:K])/0.6745)^2
v.hat[-(1:K)] <- rollmean(obj1[1:(ser.num.barX[i]-2*kn)],k=K-2*kn+1,align="left")
v.hat[1:K] <- v.hat[K+1]
}
#rho <- 2*log(ser.num.barX[ii])*
# (median(abs(ser.barX[[ii]])/sqrt(v.hat))/0.6745)^2*v.hat
rho <- 2*log(ser.num.barX[i])^(1+eps)*v.hat
ser.barX[[i]][ser.barX[[i]]^2>rho] <- 0
}
}else if(is.numeric(threshold)){
threshold <- matrix(threshold,1,n.series)
for(i in 1:n.series){
ser.barX[[i]] <- rollapplyr(ser.diffX[[i]],width=kn-1,FUN="%*%",weight)
ser.num.barX[i] <- length(ser.barX[[i]])
ser.barX[[i]][ser.barX[[i]]^2>threshold[i]] <- 0
}
}else{
for(i in 1:n.series){
ser.barX[[i]] <- rollapplyr(ser.diffX[[i]],width=kn-1,FUN="%*%",weight)
ser.num.barX[i] <- length(ser.barX[[i]])
ser.barX[[i]][ser.barX[[i]]^2>threshold[[i]][1:ser.num.barX[i]]] <- 0
}
}
ser.num.barX <- ser.num.barX-1
# core part of cce
cmat <- matrix(0, n.series, n.series) # cov
for(i in 1:n.series){
for(j in i:n.series){
if(i!=j){
#start <- kn+1
#end <- 1
#for(k in 1:ser.num.barX[i]){
# while(!(ser.times[[i]][k]<ser.times[[j]][start])&&((start-kn)<ser.num.barX[j])){
# start <- start + 1
# }
# while((ser.times[[i]][k+kn]>ser.times[[j]][end+1])&&(end<ser.num.barX[j])){
# end <- end + 1
# }
# cmat[i,j] <- cmat[i,j] + ser.barX[[i]][k]*sum(ser.barX[[j]][(start-kn):end])
#}
cmat[i,j] <- .C("pHayashiYoshida",
as.integer(kn),
as.integer(ser.num.barX[i]),
as.integer(ser.num.barX[j]),
as.double(ser.times[[i]]),
as.double(ser.times[[j]]),
as.double(ser.barX[[i]]),
as.double(ser.barX[[j]]),
value=double(1),
PACKAGE = "yuima")$value
cmat[j,i] <- cmat[i,j]
}else{
tmp <- ser.barX[[i]][1:ser.num.barX[i]]
#cmat[i,j] <- tmp%*%rollapply(tmp,width=2*(kn-1)+1,FUN="sum",partial=TRUE)
cmat[i,j] <- tmp%*%rollsum(c(double(kn-1),tmp,double(kn-1)),
k=2*(kn-1)+1)
}
}
}
cmat <- cmat/(psi.kn^2)
}
}
return(cmat)
}
###################################################################
# subsampled realized covariance
SRC <- function(data,frequency=300,avg=TRUE,utime){
d.size <- length(data)
if(missing(utime)) utime <- set_utime(data)
# allocate memory
ser.X <- vector(d.size, mode="list") # data in 'x'
ser.times <- vector(d.size, mode="list") # time index in 'x'
ser.numX <- double(d.size)
for(d in 1:d.size){
# set data and time index
ser.X[[d]] <- as.numeric(data[[d]]) # we need to transform data into numeric to avoid problem with duplicated indexes below
ser.times[[d]] <- as.numeric(time(data[[d]]))*utime
ser.numX[d] <- length(ser.X[[d]])
}
Init <- max(sapply(ser.times,FUN="head",n=1))
Terminal <- max(sapply(ser.times,FUN="tail",n=1))
grid <- seq(Init,Terminal,by=frequency)
n.sparse <- length(grid)
#I <- matrix(1,d.size,n.sparse)
K <- floor(Terminal-grid[n.sparse]) + 1
sdiff1 <- array(0,dim=c(d.size,n.sparse-1,K))
sdiff2 <- array(0,dim=c(d.size,n.sparse-2,frequency-K))
for(d in 1:d.size){
subsample <- matrix(.C("ctsubsampling",as.double(ser.X[[d]]),
as.double(ser.times[[d]]),
as.integer(frequency),as.integer(n.sparse),
as.integer(ser.numX[d]),as.double(grid),
result=double(frequency*n.sparse),
PACKAGE = "yuima")$result,
n.sparse,frequency)
sdiff1[d,,] <- diff(subsample[,1:K])
sdiff2[d,,] <- diff(subsample[-n.sparse,-(1:K)])
}
if(avg){
#cmat <- matrix(0,d.size,d.size)
#for(t in 1:frequency){
# sdiff <- matrix(0,d.size,n.sparse-1)
# for(d in 1:d.size){
# for(i in 1:n.sparse){
# while((ser.times[[d]][I[d,i]+1]<=grid[i])&&(I[d,i]<ser.numX[d])){
# I[d,i] <- I[d,i]+1
# }
# }
# sdiff[d,] <- diff(ser.X[[d]][I[d,]])
# }
# cmat <- cmat + sdiff%*%t(sdiff)
# grid <- grid+rep(1,n.sparse)
# if(grid[n.sparse]>Terminal){
# grid <- grid[-n.sparse]
#I <- I[,-n.sparse]
# n.sparse <- n.sparse-1
# I <- matrix(I[,-n.sparse],d.size,n.sparse)
# }
#}
#cmat <- cmat/frequency
cmat <- matrix(rowMeans(cbind(apply(sdiff1,3,FUN=function(x) x %*% t(x)),
apply(sdiff2,3,FUN=function(x) x %*% t(x)))),
d.size,d.size)
}else{
#sdiff <- matrix(0,d.size,n.sparse-1)
#for(d in 1:d.size){
# for(i in 1:n.sparse){
# while((ser.times[[d]][I[d,i]+1]<=grid[i])&&(I[d,i]<ser.numX[d])){
# I[d,i] <- I[d,i]+1
# }
# }
# sdiff[d,] <- diff(ser.X[[d]][I[d,]])
#}
#cmat <- sdiff%*%t(sdiff)
if(K>0){
cmat <- sdiff1[,,1]%*%t(sdiff1[,,1])
}else{
cmat <- sdiff2[,,1]%*%t(sdiff2[,,1])
}
}
return(cmat)
}
##############################################################
# subsampled realized bipower covariation
BPC <- function(sdata){
d.size <- nrow(sdata)
cmat <- matrix(0,d.size,d.size)
for(i in 1:d.size){
for(j in i:d.size){
if(i!=j){
cmat[i,j] <- (BPV(sdata[i,]+sdata[j,])-BPV(sdata[i,]-sdata[j,]))/4
cmat[j,i] <- cmat[i,j]
}else{
cmat[i,i] <- BPV(sdata[i,])
}
}
}
return(cmat)
}
SBPC <- function(data,frequency=300,avg=TRUE,utime){
d.size <- length(data)
if(missing(utime)) utime <- set_utime(data)
# allocate memory
ser.X <- vector(d.size, mode="list") # data in 'x'
ser.times <- vector(d.size, mode="list") # time index in 'x'
ser.numX <- double(d.size)
for(d in 1:d.size){
# set data and time index
ser.X[[d]] <- as.numeric(data[[d]]) # we need to transform data into numeric to avoid problem with duplicated indexes below
ser.times[[d]] <- as.numeric(time(data[[d]]))*utime
ser.numX[d] <- length(ser.X[[d]])
}
Init <- max(sapply(ser.times,FUN="head",n=1))
Terminal <- max(sapply(ser.times,FUN="tail",n=1))
grid <- seq(Init,Terminal,by=frequency)
n.sparse <- length(grid)
#I <- matrix(1,d.size,n.sparse)
K <- floor(Terminal-grid[n.sparse]) + 1
sdata1 <- array(0,dim=c(d.size,n.sparse,K))
sdata2 <- array(0,dim=c(d.size,n.sparse-1,frequency-K))
for(d in 1:d.size){
subsample <- matrix(.C("ctsubsampling",as.double(ser.X[[d]]),
as.double(ser.times[[d]]),
as.integer(frequency),as.integer(n.sparse),
as.integer(ser.numX[d]),as.double(grid),
result=double(frequency*n.sparse),
PACKAGE = "yuima")$result,
n.sparse,frequency)
sdata1[d,,] <- subsample[,1:K]
sdata2[d,,] <- subsample[-n.sparse,-(1:K)]
}
if(avg){
cmat <- matrix(0,d.size,d.size)
#for(t in 1:frequency){
# sdata <- matrix(0,d.size,n.sparse)
# for(d in 1:d.size){
# for(i in 1:n.sparse){
# while((ser.times[[d]][I[d,i]+1]<=grid[i])&&(I[d,i]<ser.numX[d])){
# I[d,i] <- I[d,i]+1
# }
# }
# sdata[d,] <- ser.X[[d]][I[d,]]
# }
# cmat <- cmat + BPC(sdata)
# grid <- grid+rep(1,n.sparse)
# if(grid[n.sparse]>Terminal){
# grid <- grid[-n.sparse]
#I <- I[,-n.sparse]
# n.sparse <- n.sparse-1
# I <- matrix(I[,-n.sparse],d.size,n.sparse)
# }
#}
#cmat <- cmat/frequency
cmat <- matrix(rowMeans(cbind(apply(sdata1,3,FUN=BPC),
apply(sdata2,3,FUN=BPC))),
d.size,d.size)
}else{
#sdata <- matrix(0,d.size,n.sparse)
#for(d in 1:d.size){
# for(i in 1:n.sparse){
# while((ser.times[[d]][I[d,i]+1]<=grid[i])&&(I[d,i]<ser.numX[d])){
# I[d,i] <- I[d,i]+1
# }
# }
# sdata[d,] <- ser.X[[d]][I[d,]]
#}
#cmat <- BPC(sdata)
if(K>0){
cmat <- BPC(sdata1[,,1])
}else{
cmat <- BPC(sdata2[,,1])
}
}
return(cmat)
}
#
# CumulativeCovarianceEstimator
#
# returns a matrix of var-cov estimates
setGeneric("cce",
function(x,method="HY",theta,kn,g=function(x)min(x,1-x),
refreshing=TRUE,cwise=TRUE,
delta=0,adj=TRUE,K,c.two,J=1,c.multi,
kernel,H,c.RK,eta=3/5,m=2,ftregion=0,
vol.init=NA,covol.init=NA,nvar.init=NA,ncov.init=NA,
mn,alpha=0.4,frequency=300,avg=TRUE,
threshold,utime,psd=FALSE)
standardGeneric("cce"))
setMethod("cce",signature(x="yuima"),
function(x,method="HY",theta,kn,g=function(x)min(x,1-x),
refreshing=TRUE,cwise=TRUE,
delta=0,adj=TRUE,K,c.two,J=1,c.multi,
kernel,H,c.RK,eta=3/5,m=2,ftregion=0,
vol.init=NA,covol.init=NA,
nvar.init=NA,ncov.init=NA,mn,alpha=0.4,
frequency=300,avg=TRUE,threshold,utime,psd=FALSE)
cce(x@data,method=method,theta=theta,kn=kn,g=g,refreshing=refreshing,
cwise=cwise,delta=delta,adj=adj,K=K,c.two=c.two,J=J,
c.multi=c.multi,kernel=kernel,H=H,c.RK=c.RK,eta=eta,m=m,
ftregion=ftregion,vol.init=vol.init,
covol.init=covol.init,nvar.init=nvar.init,
ncov.init=ncov.init,mn=mn,alpha=alpha,
frequency=frequency,avg=avg,threshold=threshold,
utime=utime,psd=psd))
setMethod("cce",signature(x="yuima.data"),
function(x,method="HY",theta,kn,g=function(x)min(x,1-x),
refreshing=TRUE,cwise=TRUE,
delta=0,adj=TRUE,K,c.two,J=1,c.multi,
kernel,H,c.RK,eta=3/5,m=2,ftregion=0,
vol.init=NA,covol.init=NA,
nvar.init=NA,ncov.init=NA,mn,alpha=0.4,
frequency=300,avg=TRUE,threshold,utime,psd=FALSE){
data <- get.zoo.data(x)
d.size <- length(data)
for(i in 1:d.size){
# NA data must be skipped
idt <- which(is.na(data[[i]]))
if(length(idt>0)){
data[[i]] <- data[[i]][-idt]
}
if(length(data[[i]])<2) {
stop("length of data (w/o NA) must be more than 1")
}
}
cmat <- NULL
switch(method,
"HY"="<-"(cmat,HY(data)),
"PHY"="<-"(cmat,PHY(data,theta,kn,g,refreshing,cwise)),
"MRC"="<-"(cmat,MRC(data,theta,kn,g,delta,adj)),
"TSCV"="<-"(cmat,TSCV(data,K,c.two,J,adj,utime)),
"GME"="<-"(cmat,GME(data,c.multi,utime)),
"RK"="<-"(cmat,RK(data,kernel,H,c.RK,eta,m,ftregion,utime)),
"QMLE"="<-"(cmat,cce.qmle(data,vol.init,covol.init,
nvar.init,ncov.init)),
"SIML"="<-"(cmat,SIML(data,mn,alpha)),
"THY"="<-"(cmat,THY(data,threshold)),
"PTHY"="<-"(cmat,PTHY(data,theta,kn,g,threshold,
refreshing,cwise)),
"SRC"="<-"(cmat,SRC(data,frequency,avg,utime)),
"SBPC"="<-"(cmat,SBPC(data,frequency,avg,utime)))
if(is.null(cmat))
stop("method is not available")
if(psd){
#tmp <- svd(cmat%*%cmat)
#cmat <- tmp$u%*%diag(sqrt(tmp$d))%*%t(tmp$v)
tmp <- eigen(cmat)
cmat <- tmp$vectors %*% (abs(tmp$values) * t(tmp$vectors))
}
if(d.size>1){
#if(all(diag(cmat)>0)){
#sdmat <- diag(sqrt(diag(cmat)))
#cormat <- solve(sdmat) %*% cmat %*% solve(sdmat)
#}else{
# cormat <- NA
#}
cormat <- cov2cor(cmat)
}else{
cormat <- as.matrix(1)
}
rownames(cmat) <- names(data)
colnames(cmat) <- names(data)
rownames(cormat) <- names(data)
colnames(cormat) <- names(data)
return(list(covmat=cmat,cormat=cormat))
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.