Skip to main content
deleted 829 characters in body
Source Link
Miguel M.
  • 558
  • 1
  • 4
  • 18

UPDATE: I double checked that the ccf and multivariate acf functions yield the same result when using two time series (the acf starts at lag 0 onwards, while the ccf calculates both lags and leads), and they actually do. So it is pretty certain that the multivariate pacf and the hypothetical pccf would behave equivalently.

> acf(ts(cbind(dx,dy)),lag.max=10)
[1] -0.180106704  0.008455514 -0.012496101  0.014837903  0.007656828  0.036804841 -0.051007264 -0.047302287  0.075819518 -0.033432934  0.001648545

> ccf(dx,dy,lag.max=10)
Autocorrelations of series ‘X’, by lag

    -7     -6     -5     -4     -3     -2     -1      0      1      2      3      4      5      6      7 
 0.006 -0.008  0.258 -0.525  0.208  0.068  0.161 -0.180  0.008 -0.012  0.015  0.008  0.037 -0.051 -0.047 

WARNING: I realised that doing:

UPDATE: I double checked that the ccf and multivariate acf functions yield the same result when using two time series (the acf starts at lag 0 onwards, while the ccf calculates both lags and leads), and they actually do. So it is pretty certain that the multivariate pacf and the hypothetical pccf would behave equivalently.

> acf(ts(cbind(dx,dy)),lag.max=10)
[1] -0.180106704  0.008455514 -0.012496101  0.014837903  0.007656828  0.036804841 -0.051007264 -0.047302287  0.075819518 -0.033432934  0.001648545

> ccf(dx,dy,lag.max=10)
Autocorrelations of series ‘X’, by lag

    -7     -6     -5     -4     -3     -2     -1      0      1      2      3      4      5      6      7 
 0.006 -0.008  0.258 -0.525  0.208  0.068  0.161 -0.180  0.008 -0.012  0.015  0.008  0.037 -0.051 -0.047 

WARNING: I realised that doing:

WARNING: I realised that doing:

updated with solutions
Source Link
Miguel M.
  • 558
  • 1
  • 4
  • 18

WARNINGUPDATE: I double checked that the ccf and multivariate acf functions yield the same result when using two time series (the acf starts at lag 0 onwards, while the ccf calculates both lags and leads), and they actually do. So it is pretty certain that the multivariate pacf and the hypothetical pccf would behave equivalently.

> acf(ts(cbind(dx,dy)),lag.max=10)
[1] -0.180106704  0.008455514 -0.012496101  0.014837903  0.007656828  0.036804841 -0.051007264 -0.047302287  0.075819518 -0.033432934  0.001648545

> ccf(dx,dy,lag.max=10)
Autocorrelations of series ‘X’, by lag

    -7     -6     -5     -4     -3     -2     -1      0      1      2      3      4      5      6      7 
 0.006 -0.008  0.258 -0.525  0.208  0.068  0.161 -0.180  0.008 -0.012  0.015  0.008  0.037 -0.051 -0.047 

WARNING: I realised that doing:

WARNING: I realised that doing:

UPDATE: I double checked that the ccf and multivariate acf functions yield the same result when using two time series (the acf starts at lag 0 onwards, while the ccf calculates both lags and leads), and they actually do. So it is pretty certain that the multivariate pacf and the hypothetical pccf would behave equivalently.

> acf(ts(cbind(dx,dy)),lag.max=10)
[1] -0.180106704  0.008455514 -0.012496101  0.014837903  0.007656828  0.036804841 -0.051007264 -0.047302287  0.075819518 -0.033432934  0.001648545

> ccf(dx,dy,lag.max=10)
Autocorrelations of series ‘X’, by lag

    -7     -6     -5     -4     -3     -2     -1      0      1      2      3      4      5      6      7 
 0.006 -0.008  0.258 -0.525  0.208  0.068  0.161 -0.180  0.008 -0.012  0.015  0.008  0.037 -0.051 -0.047 

WARNING: I realised that doing:

Source Link
Miguel M.
  • 558
  • 1
  • 4
  • 18

So, after some research on the topic... I came to realise that if you execute the following code:

pacf(ts(cbind(dx,dy)),lag.max=10)

You get the partial cross correlations between x & y.

So I researched a little, and found this link where Simone Giannerini creates a corrected version of the multivariate pacf. Here is the code:

pacf.mts <- function(x,lag.max){
    
## Partial autocorrelation function for multivariate time series       
## implements a generalization of the Durbin-Levinson Algorithm        
## as described in                                                     
## Wei(1990) Time Series Analysis, Univariate and Multivariate methods 
##           Addison Wesley.                                           
## Simone Giannerini 2007                                              

#  The author of this software is Simone Giannerini, Copyright (c) 2007   
#  Permission to use, copy, modify, and distribute this software for any  
#  purpose without fee is hereby granted, provided that this entire notice
#  is included in all copies of any software which is or includes a copy  
#  or modification of this software and in all copies of the supporting   
#  documentation for such software. 

#  This program is free software; you can redistribute it and/or modify   
#  it under the terms of the GNU General Public License as published by   
#  the Free Software Foundation; either version 2 of the License, or      
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,        
#  but WITHOUT ANY WARRANTY; without even the implied warranty of         
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          
#  GNU General Public License for more details.
#
#  A copy of the GNU General Public License is available at
#  http://www.r-project.org/Licenses/  

nser    <- ncol(x);
snames  <- colnames(x)
alpha.c <- array(0,c(nser, nser,lag.max,lag.max));
beta.c  <- array(0,c(nser, nser,lag.max,lag.max));
P       <- array(0,c(lag.max, nser, nser));
cov.x   <- acf(x,plot=FALSE,type="covariance",lag.max=lag.max)$acf;
Vu      <- array(0,dim=c(nser,nser,lag.max));
Vv      <- Vu;
Vvu     <- Vu;
Vu[,,1]  <- cov.x[1,,]; ## Gamma[0]
Vv[,,1]  <- cov.x[1,,]; ## Gamma[0]
Vvu[,,1] <- cov.x[2,,]; ## Gamma[1]
alpha.c[,,1,1] <- t(Vvu[,,1])%*%solve(Vv[,,1])
beta.c[,,1,1]  <- Vvu[,,1]%*%solve(Vu[,,1])
Du     <- diag(sqrt(diag(Vu[,,1])),nser,nser);
Dv     <- diag(sqrt(diag(Vv[,,1])),nser,nser);
P[1,,] <- solve(Dv)%*%Vvu[,,1]%*%solve(Du);
if(lag.max>=2) {
    for(s in 2:lag.max) {
        dum.u  <- 0;
        dum.v  <- 0;
        dum.vu <- 0;
        for(k in 1:(s-1)) {
            dum.u <- dum.u + alpha.c[,,s-1,k]%*%cov.x[(k+1),,];
            dum.v <- dum.v + beta.c[,,s-1,k]%*%t(cov.x[(k+1),,]);
            dum.vu<- dum.vu + cov.x[(s-k+1),,]%*%t(alpha.c[,,s-1,k]);
        }
        Vu[,,s]  <- cov.x[1,,] - dum.u;
        Vv[,,s]  <- cov.x[1,,] - dum.v;
        Vvu[,,s] <- cov.x[(s+1),,] - dum.vu;
        alpha.c[,,s,s] <- t(Vvu[,,s])%*%solve(Vv[,,s]);
        beta.c[,,s,s]  <- Vvu[,,s]%*%solve(Vu[,,s]);
        for(k in 1:(s-1)) {
            alpha.c[,,s,k] <- alpha.c[,,s-1,k]-alpha.c[,,s,s]%*%beta.c[,,s-1,s-k]
            beta.c[,,s,k]  <- beta.c[,,s-1,k] - beta.c[,,s,s]%*%alpha.c[,,s-1,s-k]
        }
        Du     <- diag(sqrt(diag(Vu[,,s])),nser,nser);
        Dv     <- diag(sqrt(diag(Vv[,,s])),nser,nser);
        P[s,,] <- solve(Dv)%*%Vvu[,,s]%*%solve(Du);
    }
}
colnames(P) <- snames;
return(P)}

Which follows the recursive algorithm described in pp. 402-414 in Wei (2005) Time Series Analysis, and actually yields the same output as the first line of code I wrote above (probably the pacf function was corrected on CRAN after he posted this new function)

I think this is what I am looking for, but why isn't it called partial cross correlation, if that's what it (seems) to be?

WARNING: I realised that doing:

pacf(cbind(dx,dy))

Yields highly undesirable results (do not understand what actually happens here, but it is certainly wrong... probably has something to do with the input class not being a ts?), after getting this output:

PACF's