Nothing
## ---- include = FALSE---------------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
## ---- eval=FALSE--------------------------------------------------------------
# install_github("wbnicholson/BigVAR/BigVAR")
## -----------------------------------------------------------------------------
library(BigVAR)
data(Y)
## -----------------------------------------------------------------------------
# 3 x 7 coefficient matrix
B = BigVAR.fit(Y,struct='Basic',p=2,lambda=1)[,,1]
# construct 7 x 99 lag matrix of Y
Z = VARXLagCons(Y,p=2,oos=TRUE)$Z
# obtain out of sample forecasts
yhat = B%*%Z[,ncol(Z),drop=F]
## ---- echo=FALSE--------------------------------------------------------------
suppressMessages(library(BigVAR,quietly=TRUE,warn.conflicts=FALSE))
#onorm=c()
library(lattice)
#Oracle=diag(3)
#SigmaU=diag(3)
SparsityPlot <- function (B, p, k,s,m, title = NULL)
{
text <- c()
for (i in 1:p) {
text1 <- as.expression(bquote(bold(Phi)^(.(i))))
text <- append(text, text1)
}
## text <- c()
if(s>0){
for (i in (p+1):(p+s+1)) {
text1 <- as.expression(bquote(bold(beta)^(.(i-p))))
text <- append(text, text1)
}
}
f <- function(m) t(m)[, nrow(m):1]
rgb.palette <- colorRampPalette(c("white", "grey" ),space = "Lab")
## rgb.palette <- colorRampPalette(c("white", "blue"), space = "Lab")
at <- seq(k/2 + 0.5, p * (k)+ 0.5, by = k)
at2 <- seq(p*k+s/2+.5,p*k+s*m+.5,by=s)
at <- c(at,at2)
se2 = seq(1.75, by = k, length = k)
L2 <- levelplot(f(abs(B)), col.regions = rgb.palette, colorkey = NULL,
xlab = NULL, ylab = NULL, main = list(label = title,
cex = 1), panel = function(...) {
panel.levelplot(...)
panel.abline(a = NULL, b = 1, h = seq(1.5, m*s+p* k +
0.5, by = 1), v = seq(1.5, by = 1, length = p *
k+m*s))
bl1 <- seq(k + 0.5, p *
k + 0.5, by = k)
bl2 <- seq(p*k + 0.5, p *
k + 0.5+s*m, by = m)
b1 <- c(bl1,bl2)
panel.abline(a = NULL, b = 1, v = p*k+.5, lwd = 7)
panel.abline(a = NULL, b = 1, v = b1, lwd = 3)
}, scales = list(x = list(alternating = 1, labels = text,
cex = 1, at = at, tck = c(0, 0)), y = list(alternating = 0,
tck = c(0, 0))))
return(L2)
}
B1 <- matrix(rep(1,57)*rbinom(57,1,.6),nrow=3,ncol=19)
B2 <-matrix(0,nrow=3,ncol=19)
B2[,1:3] <- 1
B2[,10:12] <- 1
B2[,16] <- 1
B2[,19] <- 1
B3 <-matrix(0,nrow=3,ncol=19)
diag(B3[,1:3])<- 1
B3[,10:12] <- 1
diag(B3[,10:12])<- 0
B2[,16] <- 1
B2[,19] <- 1
B4 <-matrix(0,nrow=3,ncol=19)
B4[,1:3] <- rep(1,9)*rbinom(9,1,.6)
B4[,10:12] <- rep(1,9)*rbinom(9,1,.4)
B4[,18] <- c(1,0,1)
p=5;k=3
Lasso <- SparsityPlot(B1,p,k,m=2,s=2,title="Basic VARX-L")
Group <- SparsityPlot(B2,p,k,m=2,s=2,title="Lag VARX-L")
OO <- SparsityPlot(B3,p,k,m=2,s=2,title="Own/Other VARX-L")
Sparse <- SparsityPlot(B4,p,k,m=2,s=2,title="Sparse Lag VARX-L")
## ----echo=FALSE---------------------------------------------------------------
library(gridExtra,quietly=TRUE)
grid.arrange(Lasso,Group,OO,Sparse,ncol=2)
## ----echo=FALSE---------------------------------------------------------------
k=3;p=5
HLAGC <- matrix(0,nrow=k,ncol=k*p)
HLAGC[1,] <- 1
HLAGC[2,1:6] <- 1
HLAGC[3,1:12] <- 1
HLAGOO <- matrix(0,nrow=k,ncol=k*p)
HLAGOO[1,1:13] <- 1
HLAGOO[2,1:6] <- 1
HLAGOO[3,c(1:9,12)] <- 1
HLAGELEM <- matrix(0,nrow=k,ncol=k*p)
HLAGELEM[1,c(1:10,12,13)] <- 1
HLAGELEM[2,c(1,3,4,6,7,9,10,12,13,15)] <- 1
HLAGELEM[3,c(1:8,10:11,13:14)] <- 1
SparsityPlot <-
function (B, p, k,s,m, title = NULL)
{
text <- c()
for (i in 1:p) {
text1 <- as.expression(bquote(bold('\U03A6')^(.(i))))
text <- append(text, text1)
}
## text <- c()
if(m>0){
for (i in (p+1):(p+s+1)) {
text1 <- as.expression(bquote(bold('\U03B2')^(.(i-p))))
text <- append(text, text1)
}
}
f <- function(m) t(m)[, nrow(m):1]
rgb.palette <- colorRampPalette(c("white", "grey" ),space = "Lab")
## rgb.palette <- colorRampPalette(c("white", "blue"), space = "Lab")
at <- seq(k/2 + 0.5, p * (k)+ 0.5, by = k)
if(m>0){
at2 <- seq(p*k+m/2+.5,p*k+s*m+.5,by=m)}else{at2=c()}
at <- c(at,at2)
se2 = seq(1.75, by = k, length = k)
L2 <- levelplot(f(abs(B)), col.regions = rgb.palette, colorkey = NULL,
xlab = NULL, ylab = NULL, main = list(label = title,
cex = 1), panel = function(...) {
panel.levelplot(...)
panel.abline(a = NULL, b = 1, h = seq(1.5, m*s+p* k +
0.5, by = 1), v = seq(1.5, by = 1, length = p *
k+m*s))
bl1 <- seq(k + 0.5, p *
k + 0.5, by = k)
if(m>0){
bl2 <- seq(p*k + 0.5, p *
k + 0.5+s*m, by = m)}else(bl2=c())
b1 <- c(bl1,bl2)
panel.abline(a = NULL, b = 1, v = p*k+.5, lwd = 3)
panel.abline(a = NULL, b = 1, v = b1, lwd = 3)
}, scales = list(x = list(alternating = 1, labels = text,
cex = 1, at = at, tck = c(0, 0)), y = list(alternating = 0,
tck = c(0, 0))))
return(L2)
}
set.seed(1986)
B5 <-matrix(0,nrow=3,ncol=15)
B5[,1:3] <- rep(1,9)*rbinom(9,1,.85)
B5[,4:6] <- rep(1,9)*rbinom(9,1,.65)
B5[,7:9] <- rep(1,9)*rbinom(9,1,.45)
B5[,10:12] <- rep(1,9)*rbinom(9,1,.25)
B5[,13:15] <- rep(1,9)*rbinom(9,1,.05)
HV4 <- SparsityPlot(B5,5,k,0,0,title='Lag-Weighted Lasso')
HVC=SparsityPlot(HLAGC,p,k,0,0,title="Componentwise HLAG")
HVOO=SparsityPlot(HLAGOO,p,k,0,0,title="Own/Other HLAG")
HVELEM=SparsityPlot(HLAGELEM,p,k,0,0,title="Elementwise HLAG")
grid.arrange(HVC,HVOO,HVELEM,HV4,ncol=2)
## -----------------------------------------------------------------------------
data(Y)
# Create a Basic VAR-L (Lasso Penalty) with maximum lag order p=4, 10 grid points with lambda optimized according to rolling validation of 1-step ahead MSFE
mod1<-constructModel(Y,p=4,"Basic",gran=c(150,10),h=1,cv="Rolling",verbose=FALSE,IC=TRUE,model.controls=list(intercept=TRUE))
## -----------------------------------------------------------------------------
results=cv.BigVAR(mod1)
results
## -----------------------------------------------------------------------------
str(results)
## -----------------------------------------------------------------------------
plot(results)
## -----------------------------------------------------------------------------
mod2<-constructModel(Y,p=4,"Basic",gran=c(5,10),h=1,cv="Rolling",verbose=FALSE,IC=FALSE)
res2=cv.BigVAR(mod2)
plot(res2)
## -----------------------------------------------------------------------------
mod3<-constructModel(Y,p=4,"Basic",gran=c(500,10),h=1,cv="Rolling",verbose=FALSE,IC=FALSE)
res3=cv.BigVAR(mod3)
plot(res3)
## -----------------------------------------------------------------------------
SparsityPlot.BigVAR.results(results)
## -----------------------------------------------------------------------------
predict(results,n.ahead=1)
## -----------------------------------------------------------------------------
predict(results,n.ahead=1, confint=TRUE)
## -----------------------------------------------------------------------------
coef(results)
## ----echo=TRUE----------------------------------------------------------------
data(Y) # simulated multivariate time series
# coefficient matrix used to generate Y
data(Generator)
# note that coefficients with a darker shade are larger in magnitude
SparsityPlot(A[1:3,],p=4,3,s=0,m=0,title="Sparsity Structure of Generator Matrix")
## -----------------------------------------------------------------------------
# fit a Basic VARX-L with k=2,m=1,s=2,p=4,lambda=.01
VARX=list(k=2,s=2)
#returns k x (kp+ms+1) coefficient matrix
model=BigVAR.fit(Y,p,"Basic",lambda=1e-2,VARX=VARX,intercept=TRUE)
model
## -----------------------------------------------------------------------------
# N-fold cross validation for VAR
# Y: data
# nfolds: number of cross validation folds
# struct: penalty structure
# p: lag order
# nlambdas: number of lambdas:
# gran1: depth of lambda grid
# seed: set to make it reproducible
NFoldcv <- function(Y,nfolds,struct,p,nlambdas,gran1,seed)
{
MSFE <- matrix(0,nrow=nrow(Y),ncol=10)
A <- constructModel(Y,p,struct=struct,gran=c(gran1,nlambdas),verbose=F)
# construct lag matrix
Z1 <- VARXLagCons(Y,X=NULL,s=0,p=p,0,0)
trainZ <- Z1$Z[2:nrow(Z1$Z),]
trainY <- matrix(Y[(p+1):nrow(Y),],ncol=ncol(Y))
set.seed(seed)
inds <- sample(nrow(trainY))
B <- BigVAR.est(A)
lambda.grid <- B$lambda
folds <- cut(inds,breaks=nfolds,labels=FALSE)
MSFE <- matrix(0,nrow=nfolds,ncol=nlambdas)
for(i in 1:nfolds){
test <- trainY[which(folds==i),]
train <- trainY[which(folds!=i),]
testZ <-t(t(trainZ)[which(folds!=i),])
B=BigVAR.fit(train,p=p,lambda=lambda.grid,struct='Basic')
#iterate over lambdas
for(j in 1:nlambdas){
MSFETemp <- c()
for(k in 1:nrow(test)) {
tempZ <- testZ[,k,drop=FALSE]
bhat <- matrix(B[,2:dim(B)[2],j],nrow=ncol(Y),ncol=(p*ncol(Y)))
preds <- B[,1,j]+bhat%*%tempZ
MSFETemp <- c(MSFETemp,sum(abs(test[k,]-preds))^2)
}
MSFE[i,j] <- mean(MSFETemp)
}
}
return(list(MSFE=MSFE,lambdas=lambda.grid))
}
# 10 fold cv
MSFEs<-NFoldcv(Y,nfolds=10,"Basic",p=5,nlambdas=10,gran1=50,seed=2000)
# choose smaller lambda in case of ties (prevents extremely sparse solutions)
opt=MSFEs$lambda[max(which(colMeans(MSFEs$MSFE)==min(colMeans(MSFEs$MSFE))))]
opt
## -----------------------------------------------------------------------------
data(Y)
p <- 4
T1 <- floor(nrow(Y))/3
T2 <- floor(2*nrow(Y))/3
#Matrix of zeros for X
X <- matrix(0,nrow=nrow(Y),ncol=ncol(Y))
BICMSFE <- VARXForecastEval(Y,X,p,0,T1,T2,"BIC",1)
## -----------------------------------------------------------------------------
mod <- VARXFit(Y,3,NULL,NULL)
pred <-PredictVARX(mod)
pred
## -----------------------------------------------------------------------------
library(MASS)
k=3;p=6
B=matrix(0,nrow=k,ncol=p*k)
A1<- matrix(c(.4,-.07,.08,-.06,-.7,.07,-.08,.07,-.4),ncol=3,nrow=3)
A2 <- matrix(c(-.6,0,0,0,-.4,0,0,0,.5),ncol=3,nrow=3)
B[,1:k]=A1
B[,(5*k+1):(6*k)]=A2
A <- VarptoVar1MC(B,p,k)
set.seed(2000)
Y <-MultVarSim(k,A,p,.005*diag(k),500)
SparsityPlot(B,p,k,0,0, title='Sparsity Plot of VAR Coefficient Matrix')
## ----cache=TRUE---------------------------------------------------------------
library(MCS)
# train on first 250 observations
YTrain=Y[1:250,]
Loss <- c()
T1=1*floor(nrow(YTrain)/3);T2=2*floor(nrow(YTrain)/3)
p=8
structures<-c("Basic","BasicEN","Lag","SparseLag","OwnOther","HLAGC","HLAGOO","HLAGELEM","MCP","SCAD")
for(i in structures){
# construct BigVAR object; we will perform a dual grid search for the sparse lag and sparse own/other models
if(i%in%c("SparseLag","SparseOO")){
alpha=seq(0,1,length=10)
}else{
alpha=0
}
A<- constructModel(YTrain,p=p,struct=i,gran=c(100,10),T1=T1,T2=T2,verbose=FALSE,model.controls=list(intercept=FALSE,alpha=alpha))
# perform rolling cv
res<- cv.BigVAR(A)
# save out of sample loss for each structure
Loss <- cbind(Loss,res@OOSMSFE)
}
# construct AIC and BIC benchmarks
BIC <- VARXForecastEval(YTrain,matrix(0,nrow=nrow(YTrain)),p,0,T2,nrow(YTrain),"BIC",1)$MSFE
AIC <- VARXForecastEval(YTrain,matrix(0,nrow=nrow(YTrain)),p,0,T2,nrow(YTrain),"AIC",1)$MSFE
Loss <- as.data.frame(Loss)
names(Loss) <- structures
Loss <- cbind(Loss,BIC,AIC)
names(Loss)[(ncol(Loss)-1):ncol(Loss)] <- c("BIC","AIC")
names(Loss) <- paste0(names(Loss),"L")
mcs.test <- MCSprocedure(as.matrix(Loss),verbose=FALSE)
mcs.test
## -----------------------------------------------------------------------------
suppressMessages(library(expm))
# Phi k x kp coefficient matrix
# sigma kxk residual covariance matrix
# n number of time steps to run IRF
# p lag order
# k number of series
# Y0: k dimensional vector reflecting initialization of the IRF
generateIRF <- function(Phi,Sigma,n,k,p,Y0)
{
if(p>1){
A <-VarptoVar1MC(Phi,p,k)
}else{
A <- Phi
}
J <- matrix(0,nrow=k,ncol=k*p)
diag(J) <- 1
P <- t(chol(Sigma))
IRF <- matrix(0,nrow=k,ncol=n+1)
for(i in 0:n)
{
phi1 <- J%*%(A%^%i)%*%t(J)
theta20 <- phi1%*%P
IRF[,i+1] <- (theta20%*%Y0)
}
return(IRF)
}
## ---- echo=TRUE,eval=TRUE,cache=TRUE------------------------------------------
require(quantmod)
require(zoo)
# get GDP, Federal Funds Rate, CPI from FRED
#Gross Domestic Product (Relative to 2000)
getSymbols('GDP',src='FRED',type='xts')
GDP<- aggregate(GDP,as.yearqtr,mean)
GDP <- GDP/mean(GDP["2000"])*100
# Transformation Code: First Difference of Logged Variables
GDP <- diff(log(GDP))
index(GDP) <- as.yearqtr(index(GDP))
# Federal Funds Rate
getSymbols('FEDFUNDS',src='FRED',type='xts')
FFR <- aggregate(FEDFUNDS,as.yearqtr,mean)
# Transformation Code: First Difference
FFR <- diff(FFR)
# CPI ALL URBAN CONSUMERS, relative to 1983
getSymbols('CPIAUCSL',src='FRED',type='xts')
CPI <- aggregate(CPIAUCSL,as.yearqtr,mean)
CPI <- CPI/mean(CPI['1983'])*100
# Transformation code: difference of logged variables
CPI <- diff(log(CPI))
# Seasonally Adjusted M1
getSymbols('M1SL',src='FRED',type='xts')
M1<- aggregate(M1SL,as.yearqtr,mean)
# Transformation code, difference of logged variables
M1 <- diff(log(M1))
# combine series
Y <- cbind(CPI,FFR,GDP,M1)
names(Y) <- c("CPI","FFR","GDP","M1")
Y <- na.omit(Y)
k=ncol(Y)
T <- nrow(Y)
# start/end of rolling validation
T1 <- which(index(Y)=="1985 Q1")
T2 <- which(index(Y)=="2005 Q1")
#Demean
Y <- Y - (c(rep(1, nrow(Y))))%*%t(c(apply(Y[1:T1,], 2, mean)))
#Standarize Variance
for (i in 1:k) {
Y[, i] <- Y[, i]/apply(Y[1:T1,], 2, sd)[i]
}
library(expm)
# Fit an Elementwise HLAG model
Model1=constructModel(as.matrix(Y),p=4,struct="HLAGELEM",gran=c(25,10),verbose=FALSE,VARX=list(),T1=T1,T2=T2)
Model1Results=cv.BigVAR(Model1)
# generate IRF for 10 quarters following a 1 percent increase in the federal funds rate
IRFS <- generateIRF(Phi=Model1Results@betaPred[,2:ncol(Model1Results@betaPred)],Sigma=cov(Model1Results@resids),n=10,k=ncol(Y),p=4,Y0=c(0,.01,0,0))
IRFS <- generateIRF(Model1Results@betaPred[,2:ncol(Model1Results@betaPred)],cov(Model1Results@resids),10,4,4,c(0,.01,0,0))
## ----functions, include=FALSE, echo=FALSE-------------------------------------
# A function for captioning and referencing images
fig <- local({
i <- 0
ref <- list()
list(
cap=function(refName, text) {
i <<- i + 1
ref[[refName]] <<- i
paste("Figure ", i, ": ", text, sep="")
},
ref=function(refName) {
ref[[refName]]
})
})
## ----irf_plot,fig.cap='\\label{fig:irf_plot} Generated Impulse Reponses', echo=FALSE----
# Plot IRFs
par(mfrow=c(2,2))
for(i in 1:4)
{
plot(IRFS[i,],type='l',main=names(Y)[i],ylab="",xlab="")
}
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.