I am currently working with Pesaran & Timmermann test version from year 2009. Since I could not find any R package that contains function to calculate it (rugarch has 1992 version in DACTest). I recently posted thread in cross validated with similar question where kind user mlofton advised me to look into this list. Since cross-posting is not acceptable practice after over week of hard research I managed to develop R code for newPT_test. It seems to be correct, but since I had lots of doubts maybe someone will clarify my concerns.

Here is the formula I used (Pönkä 2017):

$$PT=(T-1)(S^{-1}_{yy,w}S_{y\hat{y},w}S^{-1}_{\hat{y}\hat{y},w}S_{\hat{y}y,w}) \sim {\chi}^2_1, $$

$$S_{yy,w}=(T-1)^{-1}Y'M_wY, $$ $$S_{\hat{y}\hat{y},w}=(T-1)^{-1}\hat{Y}'M_w\hat{Y}, $$ $$S_{y\hat{y},w}=(T-1)^{-1}\hat{Y}'M_w\hat{Y},$$ $$S_{y\hat{y},w}=(T-1)^{-1}Y'M_w\hat{Y}, $$ $$M_w=I_{T-1}-W(W'W)^{-1}W', $$ $$W=(\tau_{T-1},Y_{-1},\hat{Y}_{-1}),$$

"...and $Y=(y_2,...,y_T)'$",$\hat{Y}=(\hat{y}_2,...,\hat{y}_T)$,$Y_{-1}=(y_1,...,y_{T-1})$,$\hat{Y}=(\hat{y}_1,...,\hat{y}_{T-1})$ and $\tau_t$ is as $(T-1)\times1$ vector of ones..." From other source I learned that $I_t$ is identity matrix.

My main issue was notation. I understand that $y_t$ represents ones and zeroes depending on whether change between actual value and its last observation was positive ($1$) or negative ($0$)? Same for forecast $\hat{y}_t$. I am not sure how to understand vectors: $Y=(y_2,...,y_t)'$ and $Y'$ in $S$ elements. I know that $'$ at the end of $(y_2,...,y_t)'$ means it is column vector, so $Y'$ indicates that now its row vector now?. Also it starts from $y_2$ which means I remove first observation from binary series while in $Y_{-1}=(y_1,...,y_{T-1})$ I remove last? That makes $\tau_{t-1}$ a $(T-1)\times3$ matrix right?

Here is R code:


yt=actual #assign actual to yt to make code shorter  
xt=forecast #assign forecast to xt...  

delta_yt=as.matrix(cbind(ifelse(yt-lag(yt)>0,1,0)[-1])) #calc change of yt (delta)
delta_xt=as.matrix(cbind(ifelse(xt-lag(xt)>0,1,0)[-1])) #calc change of xt(delta)
nT=length(delta_yt) #number of Time periods
Yt=cbind(delta_yt[-1]) #Yt=(y2,...,yT) 
Xt=cbind(delta_xt[-1]) #Xt=(x2,...,xT)
Yt2=as.vector(rbind(delta_yt[-nT])) #Yt2=(y1,...,yT-1)
Xt2=as.vector(rbind(delta_xt[-nT])) #Xt2=(x1,...,xT-1)
teta=rep(1,nT-1) #T-1 vector of ones
I=diag(nT-1) #Identity matrix
W=cbind(teta,Yt2,Xt2) #W matrix as in formula

Mw=I-(W%*%((t(W)%*%W)^(-1))%*%t(W))#calcualting Mw as in formula

#calculating elements S as in formula

PT=(nT-1)*(Syy.w^(-1)*Syx.w*Sxx.w^(-1)*Sxy.w)#finally calculating PT 

p.value=1-pchisq(PT,df=1)#calculating p-value
#some code to make it looks nicer
names(summary)=c("PT statistic","p.value")

I managed to solve most issues from my previous thread. Here is the link:: https://stats.stackexchange.com/questions/372776/confusions-about-pesaran-timmermann-test-2009-version?noredirect=1#comment701286_372776 It might help understand the way I approached it. So far my code seems to give correct results.

Please answer only questions from current thread. Hope I updated my question enough to not be treated as double post... And thanks again to mlofton for informing me about this great SE subsite.


1 Answer 1


Careful, you are not calculating the matrix inverse. The correct inverse is solve((t(W)%*%W)), not (t(W)%*%W)^(-1).


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.