https://github.com/cran/GAS
Raw File
Tip revision: e588e3a10bf22cb7dff4a49a848baac63d743c3f authored by Leopoldo Catania on 04 February 2022, 09:30:12 UTC
version 0.3.4
Tip revision: e588e3a
Forecast.cpp
#include <RcppArmadillo.h>
#include "DistWrap.h"
#include "Mapping.h"
#include "GASInnovation.h"

using namespace Rcpp;
using namespace arma;

//[[Rcpp::export]]
List uGASMultiForcast(arma::vec vTheta_tp1, arma::vec vKappa, arma::mat mA, arma::mat mB,
                      int iH, int iB, int iK, std::string Dist, std::string ScalingType, bool bReturnsDraws){

  arma::cube cTheta = zeros(iK,iH,iB);
  arma::mat  mY     = zeros(iB,iH);

  int h,b;
  for(b=0;b<iB;b++){
    cTheta.slice(b).col(0) = vTheta_tp1;
    mY(b,0)                = rdist_univ(vTheta_tp1, Dist);
  }

  arma::vec vInnovation(iK);
  arma::vec vTheta_tilde_t(iK);
  arma::vec vTheta_tilde_tp1(iK);

  arma::vec vIntercept = ( eye(iK,iK) - mB) * vKappa;

  for(h=1;h<iH;h++){
     for(b=0;b<iB;b++){
       vTheta_tilde_t         = UnmapParameters_univ(cTheta.slice(b).col(h-1), Dist, iK);
       vInnovation            = GASInnovation_univ(mY(b,h-1), cTheta.slice(b).col(h-1),
                                                   vTheta_tilde_t, iK, Dist, ScalingType);
       vTheta_tilde_tp1       = vIntercept + mA * vInnovation + mB * vTheta_tilde_t;
       cTheta.slice(b).col(h) = MapParameters_univ(vTheta_tilde_tp1, Dist, iK);
       mY(b,h)                = rdist_univ(cTheta.slice(b).col(h), Dist);
    }
  }

  List lOut;

  if(bReturnsDraws) lOut["mY"]     = mY;
  lOut["cTheta"] = cTheta;

  return lOut;

}

//[[Rcpp::export]]
List mGASMultiForcast(arma::vec vTheta_tp1, arma::vec vKappa, arma::mat mA, arma::mat mB,
                      int iH, int iB, int iK, int iN, std::string Dist, std::string ScalingType,
                      bool bReturnsDraws){

  arma::cube cTheta = zeros(iK,iH,iB);
  arma::cube cY     = zeros(iN,iH,iB);

  int h,b;
  for(b=0;b<iB;b++){
    cTheta.slice(b).col(0) = vTheta_tp1;
    cY.slice(b).col(0)     = rdist_multi(vTheta_tp1, iN, Dist);
  }

  arma::vec vInnovation(iK);
  arma::vec vTheta_tilde_t(iK);
  arma::vec vTheta_tilde_tp1(iK);

  arma::vec vIntercept = ( eye(iK,iK) - mB) * vKappa;

  for(h=1;h<iH;h++){
    for(b=0;b<iB;b++){
      vTheta_tilde_t         = UnmapParameters_multi(cTheta.slice(b).col(h-1), Dist, iN, iK);
      vInnovation            = GASInnovation_multi(cY.slice(b).col(h-1), cTheta.slice(b).col(h-1),
                                                  vTheta_tilde_t, iN, iK, Dist, ScalingType);
      vTheta_tilde_tp1       = vIntercept + mA * vInnovation + mB * vTheta_tilde_t;
      cTheta.slice(b).col(h) = MapParameters_multi(vTheta_tilde_tp1, Dist, iN, iK);
      cY.slice(b).col(h)     = rdist_multi(cTheta.slice(b).col(h), iN, Dist);
    }
  }

  List lOut;

  if(bReturnsDraws) lOut["cY"] = cY;
  lOut["cTheta"] = cTheta;

  return lOut;

}
back to top