1# the full log-likelihood function of the DCC-GARCH(1,1) model
2loglik.dcc <- function (param, dvar, model) {
3    nobs <- dim(dvar)[1]
4    ndim <- dim(dvar)[2]
5    Id <- diag(ndim)
6    npar <- length(param)
7    dcc.param <- param[(npar-1):npar]
8
9      if(model=="diagonal"){                       # for the diagonal vector GARCH equation
10         a <- param[1:ndim]                         # constant in variance
11         A <- diag(param[(ndim+1):(2*ndim)])        # ARCH parameter
12         B <- diag(param[(2*ndim+1):(3*ndim)])      # GARCH parameter
13      } else if(model=="extended"){                # for the extended vector GARCH equation
14         a <- param[1:ndim]
15         A <- matrix(param[(ndim+1):(ndim^2+ndim)], ndim, ndim)
16         B <- matrix(param[(ndim^2+ndim+1):(2*ndim^2+ndim)], ndim, ndim)
17      }
18
19    h <- vector.garch(dvar, a, A, B)
20    z <- dvar/sqrt(h)
21    DCC <- dcc.est(z, dcc.param)$DCC
22
23#    lf1 <- -0.5*ndim*log(2*pi) - rowSums(log(h)) -0.5*rowSums(z^2)
24    lf1 <- -0.5*ndim*log(2*pi) - rowSums(log(h))         # bug fixed on 23072009
25    lf2 <- numeric(nobs)
26   for( i in 1:nobs){
27      R <- matrix(DCC[i,], ndim, ndim)
28      invR <- solve(R)
29      tmpz <- as.vector(z[i,])
30      lf2[i] <- -0.5*(log(det(R)) +sum(tmpz*crossprod(invR, tmpz)))
31   }
32    sum(lf1 + lf2)
33}
34