R/REML.saery.AR1.R

REML.saery.AR1 <-
function(X, ydi, D, md, sigma2edi, sigma1.0=1, sigma2.0=1, rho=0.5, MAXITER=20) {
  rho.f <- rho
  sigma1.f <- sigma1.0
  sigma2.f <- sigma2.0
  theta.f <- c(sigma1.f,sigma2.f,rho.f)
  Bad <- 0
  FLAG <- 0
  p <- ncol(X)
  a <- list(1:md[1])
  mdcum <- cumsum(md)
  for(d in 2:D)
    a[[d]] <- (mdcum[d-1]+1):mdcum[d]
  yd <- Xd <- list()
  for(d in 1:D) {
    yd[[d]] <- ydi[a[[d]]]
    Xd[[d]] <- X[a[[d]],]
  }
  for(ITER in 1:MAXITER){
    Vd.inv <- V1d <- V2d <- V3d <- VinvV1d <- VinvV2d <- VinvV3d <- Vinvyd <- VinvXd <- XtVinvV1dVinvX <- XtVinvV2dVinvX <- XtVinvV3dVinvX <-
      VinvV1dVinvV1d <- VinvV2dVinvV2d <- VinvV3dVinvV3d <- XtVinvV1dVinvV1dVinvX <- VinvV1dVinvV2d <- VinvV1dVinvV3d <- VinvV2dVinvV3d <-
      XtVinvV2dVinvV2dVinvX <- XtVinvV3dVinvV3dVinvX <- XtVinvV1dVinvV2dVinvX <- XtVinvV1dVinvV3dVinvX<- XtVinvV2dVinvV3dVinvX <- XtVinvV3dVinvV3dVinvX <-list()
    Q.inv <- matrix(0, nrow=p, ncol=p)
    tr.VinvV1d <- tr.VinvV2d <- tr.VinvV3d <- tr.VinvV1dVinvV1d <- tr.VinvV2dVinvV2d <- tr.VinvV3dVinvV3d <- tr.VinvV1dVinvV2d <- tr.VinvV1dVinvV3d <- tr.VinvV2dVinvV3d <- ytVinvX <- ytVinvV1dVinvy <- SumXtVinvV1dVinvX <- ytVinvV1dVinvX <- ytVinvV2dVinvy <- ytVinvV2dVinvX <- SumXtVinvV2dVinvX <- ytVinvV3dVinvy <- ytVinvV3dVinvX <- SumXtVinvV3dVinvX <- 0
    for(d in 1:D) { 
      uno <- rep(1,md[d])
      V1d[[d]] <- uno%*%t(uno)
      Omegad <- matrix(0,nrow=md[d],ncol=md[d])
      Omegad[lower.tri(Omegad)] <- rho.f^sequence((md[d]-1):1)
      Omegad <- Omegad+t(Omegad)
      diag(Omegad) <- 1
      Omegad <- (1/(1-rho.f^2))*Omegad 
      V2d[[d]] <- Omegad
      OmegadPrima <- matrix(0,nrow=md[d],ncol=md[d])
      OmegadPrima[lower.tri(OmegadPrima)] <- sequence((md[d]-1):1)*rho.f^(sequence((md[d]-1):1)-1)
      OmegadPrima <- OmegadPrima+t(OmegadPrima)
      OmegadPrima <- (1/(1-rho.f^2))*OmegadPrima
      OmegadPrima <- OmegadPrima + (2*rho.f/(1-rho.f^2))*Omegad
      V3d[[d]] <- sigma2.f*OmegadPrima
      Vd <- (sigma1.f *(uno%*%t(uno)) + sigma2.f * Omegad + diag(sigma2edi[a[[d]]]))                      
      if(abs(det(Vd))<0.000000001 || abs(det(Vd))>10000000000) {
        FLAG <- 1
        Bad <- Bad+1
        break
      }
      Vd.inv[[d]] <- solve(Vd)                                    
      Vinvyd[[d]] <- Vd.inv[[d]]%*%yd[[d]]
      VinvXd[[d]] <- Vd.inv[[d]]%*%Xd[[d]]
      Q.inv <- Q.inv + t(Xd[[d]])%*%VinvXd[[d]]
      VinvV1d[[d]] <- Vd.inv[[d]]%*%V1d[[d]]
      tr.VinvV1d <-  tr.VinvV1d + sum(diag(VinvV1d[[d]]))
      XtVinvV1dVinvX[[d]]<- t(VinvXd[[d]])%*%V1d[[d]]%*%VinvXd[[d]]
      ytVinvX <- ytVinvX + t(yd[[d]])%*%VinvXd[[d]]
      ytVinvV1dVinvy <- ytVinvV1dVinvy + t(Vinvyd[[d]])%*%V1d[[d]]%*%Vinvyd[[d]]
      ytVinvV1dVinvX <-  ytVinvV1dVinvX + t(Vinvyd[[d]])%*%V1d[[d]]%*%VinvXd[[d]]
      SumXtVinvV1dVinvX <- SumXtVinvV1dVinvX + XtVinvV1dVinvX[[d]]
      VinvV2d[[d]] <- Vd.inv[[d]]%*%V2d[[d]]
      tr.VinvV2d <-  tr.VinvV2d + sum(diag(VinvV2d[[d]]))
      XtVinvV2dVinvX[[d]] <- t(VinvXd[[d]])%*%V2d[[d]]%*%VinvXd[[d]]
      ytVinvV2dVinvy <- ytVinvV2dVinvy + t(Vinvyd[[d]])%*%V2d[[d]]%*%Vinvyd[[d]]
      ytVinvV2dVinvX <-  ytVinvV2dVinvX + t(Vinvyd[[d]])%*%V2d[[d]]%*%VinvXd[[d]]
      SumXtVinvV2dVinvX <- SumXtVinvV2dVinvX + XtVinvV2dVinvX[[d]]
      VinvV3d[[d]] <- Vd.inv[[d]]%*%V3d[[d]]
      tr.VinvV3d <-  tr.VinvV3d + sum(diag(VinvV3d[[d]]))
      XtVinvV3dVinvX[[d]] <- t(VinvXd[[d]])%*%V3d[[d]]%*%VinvXd[[d]]
      ytVinvV3dVinvy <- ytVinvV3dVinvy + t(Vinvyd[[d]])%*%V3d[[d]]%*%Vinvyd[[d]]
      ytVinvV3dVinvX <-  ytVinvV3dVinvX + t(Vinvyd[[d]])%*%V3d[[d]]%*%VinvXd[[d]]
      SumXtVinvV3dVinvX <- SumXtVinvV3dVinvX + XtVinvV3dVinvX[[d]]
      VinvV1dVinvV1d[[d]]  <- Vd.inv[[d]]%*%V1d[[d]]%*%Vd.inv[[d]]%*%V1d[[d]]  
      tr.VinvV1dVinvV1d <-  tr.VinvV1dVinvV1d + sum(diag(VinvV1dVinvV1d[[d]]))
      XtVinvV1dVinvV1dVinvX[[d]] <- t(VinvXd[[d]])%*%V1d[[d]]%*%Vd.inv[[d]]%*%V1d[[d]]%*%VinvXd[[d]]        
      VinvV2dVinvV2d[[d]]  <- Vd.inv[[d]]%*%V2d[[d]]%*%Vd.inv[[d]]%*%V2d[[d]]    
      tr.VinvV2dVinvV2d <-  tr.VinvV2dVinvV2d + sum(diag(VinvV2dVinvV2d[[d]]))
      XtVinvV2dVinvV2dVinvX[[d]] <- t(VinvXd[[d]])%*%V2d[[d]]%*%Vd.inv[[d]]%*%V2d[[d]]%*%VinvXd[[d]]     
      VinvV3dVinvV3d[[d]]  <- Vd.inv[[d]]%*%V3d[[d]]%*%Vd.inv[[d]]%*%V3d[[d]]   
      tr.VinvV3dVinvV3d <-  tr.VinvV3dVinvV3d + sum(diag(VinvV3dVinvV3d[[d]]))
      XtVinvV3dVinvV3dVinvX[[d]] <- t(VinvXd[[d]])%*%V3d[[d]]%*%Vd.inv[[d]]%*%V3d[[d]]%*%VinvXd[[d]] 
      VinvV1dVinvV2d[[d]]  <- Vd.inv[[d]]%*%V1d[[d]]%*%Vd.inv[[d]]%*%V2d[[d]]     
      tr.VinvV1dVinvV2d <-  tr.VinvV1dVinvV2d + sum(diag(VinvV1dVinvV2d[[d]]))
      XtVinvV1dVinvV2dVinvX[[d]] <- t(VinvXd[[d]])%*%V1d[[d]]%*%Vd.inv[[d]]%*%V2d[[d]]%*%VinvXd[[d]]               
      VinvV1dVinvV3d[[d]]  <- Vd.inv[[d]]%*%V1d[[d]]%*%Vd.inv[[d]]%*%V3d[[d]]     
      tr.VinvV1dVinvV3d <-  tr.VinvV1dVinvV3d + sum(diag(VinvV1dVinvV3d[[d]]))
      XtVinvV1dVinvV3dVinvX[[d]] <- t(VinvXd[[d]])%*%V1d[[d]]%*%Vd.inv[[d]]%*%V3d[[d]]%*%VinvXd[[d]]               
      VinvV2dVinvV3d[[d]]  <- Vd.inv[[d]]%*%V2d[[d]]%*%Vd.inv[[d]]%*%V3d[[d]]     
      tr.VinvV2dVinvV3d <-  tr.VinvV2dVinvV3d + sum(diag(VinvV2dVinvV3d[[d]]))
      XtVinvV2dVinvV3dVinvX[[d]] <- t(VinvXd[[d]])%*%V2d[[d]]%*%Vd.inv[[d]]%*%V3d[[d]]%*%VinvXd[[d]]           
    }
    if(FLAG==1){
      FLAG<-0
      ITER==MAXITER 
      break
    }
    Q <- solve(Q.inv)
    tr.XtVinvV1dVinvXQ <- tr.XtVinvV2dVinvXQ  <- tr.XtVinvV3dVinvXQ <- tr.XtVinvV1dVinvV1dVinvXQ  <- tr.XtVinvV2dVinvV2dVinvXQ <- tr.XtVinvV3dVinvV3dVinvXQ <- tr.XtVinvV1dVinvV2dVinvXQ <- tr.XtVinvV1dVinvV3dVinvXQ <- tr.XtVinvV2dVinvV3dVinvXQ <- XtVinvV1dVinvXQ <- XtVinvV2dVinvXQ <- XtVinvV3dVinvXQ <- 0
    for(d in 1:D){
      tr.XtVinvV1dVinvXQ <- tr.XtVinvV1dVinvXQ + sum(diag(XtVinvV1dVinvX[[d]]%*%Q))
      tr.XtVinvV2dVinvXQ <- tr.XtVinvV2dVinvXQ + sum(diag(XtVinvV2dVinvX[[d]]%*%Q))
      tr.XtVinvV3dVinvXQ <- tr.XtVinvV3dVinvXQ + sum(diag(XtVinvV3dVinvX[[d]]%*%Q))
      tr.XtVinvV1dVinvV1dVinvXQ <- tr.XtVinvV1dVinvV1dVinvXQ  + sum(diag(XtVinvV1dVinvV1dVinvX[[d]]%*%Q))
      XtVinvV1dVinvXQ  <- XtVinvV1dVinvXQ + XtVinvV1dVinvX[[d]]%*%Q
      tr.XtVinvV2dVinvV2dVinvXQ <- tr.XtVinvV2dVinvV2dVinvXQ + sum(diag(XtVinvV2dVinvV2dVinvX[[d]]%*%Q))
      XtVinvV2dVinvXQ  <- XtVinvV2dVinvXQ + XtVinvV2dVinvX[[d]]%*%Q      
      tr.XtVinvV3dVinvV3dVinvXQ <- tr.XtVinvV3dVinvV3dVinvXQ + sum(diag(XtVinvV3dVinvV3dVinvX[[d]]%*%Q))
      XtVinvV3dVinvXQ  <- XtVinvV3dVinvXQ + XtVinvV3dVinvX[[d]]%*%Q      
      tr.XtVinvV1dVinvV2dVinvXQ <- tr.XtVinvV1dVinvV2dVinvXQ + sum(diag(XtVinvV1dVinvV2dVinvX[[d]]%*%Q))
      tr.XtVinvV1dVinvV3dVinvXQ <- tr.XtVinvV1dVinvV3dVinvXQ + sum(diag(XtVinvV1dVinvV3dVinvX[[d]]%*%Q))
      tr.XtVinvV2dVinvV3dVinvXQ <- tr.XtVinvV2dVinvV3dVinvXQ + sum(diag(XtVinvV2dVinvV3dVinvX[[d]]%*%Q))
    }
    tr.XtVinvV1dVinvXQXtVinvV1dVinvXQ <- sum(diag(XtVinvV1dVinvXQ%*%XtVinvV1dVinvXQ)) 
    tr.XtVinvV2dVinvXQXtVinvV2dVinvXQ <- sum(diag(XtVinvV2dVinvXQ%*%XtVinvV2dVinvXQ))
    tr.XtVinvV3dVinvXQXtVinvV3dVinvXQ <- sum(diag(XtVinvV3dVinvXQ%*%XtVinvV3dVinvXQ))
    tr.XtVinvV1dVinvXQXtVinvV2dVinvXQ  <- sum(diag(XtVinvV1dVinvXQ%*%XtVinvV2dVinvXQ))
    tr.XtVinvV1dVinvXQXtVinvV3dVinvXQ  <- sum(diag(XtVinvV1dVinvXQ%*%XtVinvV3dVinvXQ))
    tr.XtVinvV2dVinvXQXtVinvV3dVinvXQ  <- sum(diag(XtVinvV2dVinvXQ%*%XtVinvV3dVinvXQ))
    tr.PV1 <- tr.VinvV1d - tr.XtVinvV1dVinvXQ 
    tr.PV2 <- tr.VinvV2d - tr.XtVinvV2dVinvXQ
    tr.PV3 <- tr.VinvV3d - tr.XtVinvV3dVinvXQ
    tr.PV1PV1  <- tr.VinvV1dVinvV1d - 2*tr.XtVinvV1dVinvV1dVinvXQ + tr.XtVinvV1dVinvXQXtVinvV1dVinvXQ
    tr.PV2PV2  <- tr.VinvV2dVinvV2d - 2*tr.XtVinvV2dVinvV2dVinvXQ + tr.XtVinvV2dVinvXQXtVinvV2dVinvXQ
    tr.PV3PV3  <- tr.VinvV3dVinvV3d - 2*tr.XtVinvV3dVinvV3dVinvXQ + tr.XtVinvV3dVinvXQXtVinvV3dVinvXQ
    tr.PV1PV2  <- tr.VinvV1dVinvV2d - 2*tr.XtVinvV1dVinvV2dVinvXQ + tr.XtVinvV1dVinvXQXtVinvV2dVinvXQ
    tr.PV1PV3  <- tr.VinvV1dVinvV3d - 2*tr.XtVinvV1dVinvV3dVinvXQ + tr.XtVinvV1dVinvXQXtVinvV3dVinvXQ
    tr.PV2PV3  <- tr.VinvV2dVinvV3d - 2*tr.XtVinvV2dVinvV3dVinvXQ + tr.XtVinvV2dVinvXQXtVinvV3dVinvXQ
    ytPV1Py  <- ytVinvV1dVinvy - 2*ytVinvV1dVinvX%*%Q%*%t(ytVinvX)+ytVinvX%*%Q%*%SumXtVinvV1dVinvX%*%Q%*%t(ytVinvX)
    ytPV2Py  <- ytVinvV2dVinvy - 2*ytVinvV2dVinvX%*%Q%*%t(ytVinvX)+ytVinvX%*%Q%*%SumXtVinvV2dVinvX%*%Q%*%t(ytVinvX)
    ytPV3Py  <- ytVinvV3dVinvy - 2*ytVinvV3dVinvX%*%Q%*%t(ytVinvX)+ytVinvX%*%Q%*%SumXtVinvV3dVinvX%*%Q%*%t(ytVinvX)
    S1 <- -0.5*tr.PV1 + 0.5*ytPV1Py
    S2 <- -0.5*tr.PV2 + 0.5*ytPV2Py
    S3 <- -0.5*tr.PV3 + 0.5*ytPV3Py
    F11  <- 0.5*tr.PV1PV1
    F22  <- 0.5*tr.PV2PV2
    F33  <- 0.5*tr.PV3PV3
    F12  <- 0.5*tr.PV1PV2
    F13  <- 0.5*tr.PV1PV3
    F23  <- 0.5*tr.PV2PV3
    Ssig <- c(S1,S2,S3)
    Fsig <- matrix(c(F11,F12,F13,F12,F22,F23,F13,F23,F33),ncol=3)
    if(abs(det(Fsig))< 0.000000001 || sum(abs(Fsig))>10000000000) {
      ITER <- MAXITER
      Bad <- Bad+1
      break
    }
    Fsig.inv <- solve(Fsig)
    dif <- Fsig.inv%*%Ssig
    theta.f <- theta.f + dif
    rho.f <- theta.f[3,1]
    sigma1.f <- theta.f[1,1]
    sigma2.f <- theta.f[2,1]
    if(identical(as.numeric(abs(dif)<0.00001),rep(1,3)))  # Criterio de parada
      break
  }
  if(sigma1.f<0 || sigma2.f<0 || rho.f< -1 || rho.f>1) {
    ITER <- MAXITER
    Bad <- Bad+1
  }
  return(list(as.vector(theta.f), Fsig, ITER, Bad, Q))
}

Try the saery package in your browser

Any scripts or data that you put into this service are public.

saery documentation built on May 2, 2019, 4:17 a.m.