Cointegration, R, Irish Mortgage Debt and Property Prices

May 15, 2011
By

(This article was first published on TimeSeriesIreland » R, and kindly contributed to R-bloggers)

As a follow-up to my post examining the stationarity of the new property price index, this post will briefly look at some of the dynamics of mortgage debt and property prices; all data is monthly, from the beginning of 2005 to March 2011. This will also serve as an illustration of the ‘vars‘ and ‘urca‘ packages by Bernhard Pfaff, with relevant R code at the bottom of this post.

To begin, we look to the stationarity of each series. First, I transform the data by taking the (natural) log to help induce homoskedasticity and normally distributed errors, and for ease of interpretation as log changes approximate growth rates and are additive through time. One interesting feature I noted in the previous post was the apparent high order of integretion in the house price index, which carries over with the log transformation. (For those unfamiliar with this terminology: if a series is integrated of order, say, d we mean it is (asymptotically) stationary if differenced d times, denoted y_t \sim I(d), where y_t is the relevant time-series; stationary, in any context I refer to, implies weakly (or covariance) stationary, where the first and second moments of the distribution exist and are not a function of time.)

Augmented Dickey-Fuller (ADF) Tests:

Test Statistic: DebtTest Statistic: Property1 Pct5 Pct10 Pct
\tau_{ct}-1.966106-3.427696-4.04-3.45-3.15
\tau_{c}-1.018575-1.220702-3.51-2.89-2.58
\tau_{n}-1.522126-1.255785-2.60-1.95-1.61

KPSS Tests:

Test Statistic: DebtTest Statistic: Property1 Pct5 Pct10 PctNo. Lags
\mu1.03245620.98150380.7390.4630.3473
\mu0.39069510.98150380.7390.4630.34711
\tau0.48381720.98150380.2160.1460.1193
\tau0.19037860.98150380.2160.1460.11911

Analysing the first-differences of each series presents a messier picture:

ADF Tests:

Test Statistic: DebtTest Statistic: Property1 Pct5 Pct10 Pct
\tau_{ct}-6.373145-1.9932346-4.04-3.45-3.15
\tau_{c}-1.335485-1.1632033-3.51-2.89-2.58
\tau_{n}-2.039878-0.7706823-2.60-1.95-1.61

KPSS Tests:

Test Statistic: DebtTest Statistic: Property1 Pct5 Pct10 PctNo. Lags
\mu1.419756071.45473230.7390.4630.3473
\mu0.645287720.55812140.7390.4630.34711
\tau0.107417370.22833260.2160.1460.1193
\tau0.098822180.11286490.2160.1460.11911

If we proceed under the assumption that both series are I(2), the question of cointegration naturally arises. Augmented Engle-Granger tests point to no cointegration, with a test statistic of -1.1410, but a cointegrating regression Durbin-Watson test rejects the null of no cointegration at the 5% significance level (DW stat: 0.7419, critical value: 0.38-0.72). Below is a scatter plot of the first-difference of each series,

Assuming there is a cointegrating relationship between the variables, CI(2,1), lag-order selection criteria from the ‘vars’ package implies an appropriate lag-order of 5, based on minimising the AIC and final prediction error (FPE). As our data only goes back to the beginning of 2005, degrees of freedom are an issue when estimating these models, and there is a trade-off against longer lag-order models due to the short sample size.

The Johansen procedure identifies a cointegrating rank, r, of one (which is natural, as there are only two variables in the VAR),

Maximal Eigenvalue test:

Test Statistic1 Pct5 Pct10 Pct
r \leq 12.747.529.2412.97
r = 019.3020.2015.6713.75

Trace test:

Test Statistic1 Pct5 Pct10 Pct
r \leq 12.747.529.2412.97
r = 022.0424.6019.9617.85

The orthoganalised impulse response functions from the level-form of the vector error correction model are given below (click to make it larger):

(95% bootstrapped confidence intervals with 10,000 runs.) The first graph roughly shows what the effect of a one percentage point shock to mortgage debt will be on the national property price index over time. The second plot shows the effect on the mortgage debt level from a one percentage point shock to property prices. Here we can see the effect of deleveraging on asset prices, and the effect of falling asset prices on the amount of credit extended to households to purchase property.

R Code:

require(tseries)
require(urca)
require(vars)
require(ggplot2)
#
a<-read.csv(file="Book1.csv")
#
Debt<-a[,4]
Property<-a[,2]
#
debtts<-ts(Debt,start = c(2005, 1), end = c(2011, 3), frequency=12)
propts<-ts(Property,start = c(2005, 1), end = c(2011, 3), frequency=12)
#
ddebtts<-diff(debtts)
dpropts<-diff(propts)
#
ldebtts<-log(debtts)
lpropts<-log(propts)
#
dldebtts<-diff(ldebtts)
dlpropts<-diff(lpropts)
#
ddldebtts<-diff(dldebtts)
ddlpropts<-diff(dlpropts)
#
### ADF and KPSS Tests:
summary(ur.df(lpropts,type="trend",lags = 12, selectlags="AIC"))
summary(ur.df(lpropts,type="drift",lags = 12, selectlags="AIC"))
summary(ur.df(lpropts,type="none",lags = 12, selectlags="AIC"))
#
summary(ur.kpss(lpropts,type="mu",lags="short"))
summary(ur.kpss(lpropts,type="mu",lags="long"))
summary(ur.kpss(lpropts,type="tau",lags="short"))
summary(ur.kpss(lpropts,type="tau",lags="long"))
#
summary(ur.df(dlpropts,type="trend",lags = 12, selectlags="AIC"))
summary(ur.df(dlpropts,type="drift",lags = 12, selectlags="AIC"))
summary(ur.df(dlpropts,type="none",lags = 12, selectlags="AIC"))
#
summary(ur.kpss(dlpropts,type="mu",lags="short"))
summary(ur.kpss(dlpropts,type="mu",lags="long"))
summary(ur.kpss(dlpropts,type="tau",lags="short"))
summary(ur.kpss(dlpropts,type="tau",lags="long"))
#
summary(ur.df(ldebtts,type="trend",lags = 12, selectlags="AIC"))
summary(ur.df(ldebtts,type="drift",lags = 12, selectlags="AIC"))
summary(ur.df(ldebtts,type="none",lags = 12, selectlags="AIC"))
#
summary(ur.kpss(ldebtts,type="mu",lags="short"))
summary(ur.kpss(ldebtts,type="mu",lags="long"))
summary(ur.kpss(ldebtts,type="tau",lags="short"))
summary(ur.kpss(ldebtts,type="tau",lags="long"))
#
summary(ur.df(dldebtts,type="trend",lags = 12, selectlags="AIC"))
summary(ur.df(dldebtts,type="drift",lags = 12, selectlags="AIC"))
summary(ur.df(dldebtts,type="none",lags = 12, selectlags="AIC"))
#
summary(ur.kpss(dldebtts,type="mu",lags="short"))
summary(ur.kpss(dldebtts,type="mu",lags="long"))
summary(ur.kpss(dldebtts,type="tau",lags="short"))
summary(ur.kpss(dldebtts,type="tau",lags="long"))
#
creg<-lm(dlpropts~dldebtts)
dwtest(creg1)
#
# Scatter Plot
DLDebt<-as.numeric(dldebtts)
DLProperty<-as.numeric(dlpropts)
scdata<-data.frame(DLDebt,DLProperty)
#
sc1.1<-ggplot(scdata,aes(DLDebt,DLProperty)) + xlab("FD Log Mortgage Debt") + ylab("FD Log National Property Prices")
sc1.2<-sc1.1+geom_point(shape=18,colour="darkred", size=3) + opts(title="",plot.title = theme_text(size = 11),axis.title.y = theme_text(size = 8.5,angle = 90),axis.title.x = theme_text(size = 8.5))
sc1.3<- sc1.2 + geom_hline(yintercept=0,linetype=1,colour="black") + geom_vline(xintercept=0,linetype=1,colour="black")
#
png(filename = "scatter1.png", width = 500, height = 400, units = "px", pointsize = 12, bg = "white")
sc1.3
dev.off()
#
### Johansen Procedure:
johandata<-data.frame(dldebtts,dlpropts)
#
VARselect(johandata, lag.max = 6, type="const")
#
johan3.1 <- ca.jo(johandata, ecdet = "const", type="eigen", K=5, spec="transitory",season=NULL)
johan3.2 <- ca.jo(johandata, ecdet = "const", type="trace", K=5, spec="transitory",season=NULL)
summary(johan3.1)
summary(johan3.2)
#
### VECM
vecm31<-cajorls(johan3.1,r=1)
summary(vecm31$rlm)
#
### VEC2VAR
vecvar3.1<-vec2var(johan3.1, r = 1)
#logLik(vecvar3.1)
#
### Orthogonalised IRFs
irf1 <- irf(vecvar3.1, impulse = "dldebtts", response = "dlpropts",n.ahead = 25, boot = TRUE,ci=0.95,runs = 10000,seed=1234)
irf1.prop<-ts(irf1$irf$dldebtts[,1])
irf1.prop.l<-irf1$Lower$dldebtts[,1]
irf1.prop.u<-irf1$Upper$dldebtts[,1]
#
irf2 <- irf(vecvar3.1, impulse = "dlpropts", response = "dldebtts",n.ahead = 25, boot = TRUE,ci=0.95,runs = 10000,seed=1224)
irf2.debt<-ts(irf2$irf$dlpropts[,1])
irf2.debt.l<-irf2$Lower$dlpropts[,1]
irf2.debt.u<-irf2$Upper$dlpropts[,1]
#
### Plotting the IRFs
irf1.prop<-as.numeric(irf1.prop)
irf2.debt<-as.numeric(irf2.debt)
timet<-1:26
#
df.irf<-data.frame(irf1.prop,irf1.prop.l,irf1.prop.u,irf2.debt,irf2.debt.l,irf2.debt.u)
df.irf<- df.irf*100
df.irf<- data.frame(timet,df.irf)
#
ggirf1.1<-ggplot(df.irf,aes(timet)) + xlab("Months") + ylab("% Change in Property Price Index")
ggirf1.2<-ggirf1.1 + geom_line(aes(y = irf1.prop, colour = "Property Price Index")) + geom_line(aes(y = irf1.prop.l, colour = "95% CI")) + geom_line(aes(y = irf1.prop.u, colour = "95% CI")) + scale_colour_hue("Series:") + opts(title=substitute(paste("IRF for ",Delta," Log(Property Price Index)"))) + opts(legend.position=c(.13,0.82))
#ggirf1.2
#
ggirf2.1<-ggplot(df.irf,aes(timet)) + xlab("Months") + ylab("% Change in Mortgage Debt Index")
ggirf2.2<-ggirf2.1 + geom_line(aes(y = irf2.debt, colour = "Mortgage Debt")) + geom_line(aes(y = irf2.debt.l, colour = "95% CI")) + geom_line(aes(y = irf2.debt.u, colour = "95% CI")) + scale_colour_hue("Series:") + opts(title=substitute(paste("IRF for ",Delta," Log(Mortgage Debt Index)"))) + opts(legend.position=c(.12,0.82))
#ggirf2.2
#
png(filename = "irf1.png", width = 1000, height = 1000, units = "px", pointsize = 12, bg = "white")
grid.newpage()
pushViewport(viewport(layout=grid.layout(2,1)))
vplayout<-function(x,y) viewport(layout.pos.row=x, layout.pos.col=y)
print(ggirf1.2, vp = vplayout(1,1))
print(ggirf2.2, vp = vplayout(2,1))
dev.off()
#

To leave a comment for the author, please follow the link and comment on his blog: TimeSeriesIreland » R.

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...



If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Tags: , , ,

Comments are closed.