#include // [[Rcpp::depends(RcppArmadillo)]] using namespace Rcpp; #define _USE_MATH_DEFINES #include NumericMatrix duplicateMat(NumericMatrix X){ NumericMatrix Y(X.nrow(),X.ncol()); for (int i=0; i 0){ res = 1; } return(res); } double noneg(double x){ if (x < 0){ x = 0; } return(x); } double absfun(double x){ if (x < 0){ x = -1*x; } return(x); } // Ridge regression beta // [[Rcpp::export]] NumericMatrix beta_ridge_C(NumericMatrix X, NumericMatrix Y, double lambda_beta){ int n = X.nrow(), nX = X.ncol(), nY = Y.ncol(); // Create lambda identity: NumericMatrix lambdaIden(nX,nX); std::fill(lambdaIden.begin(), lambdaIden.end(), 0.0); for (int i=0;i(wrap(beta_ridge_))); } // Compute Beta given Kappa: // [[Rcpp::export]] NumericMatrix Beta_C(NumericMatrix kappa, NumericMatrix beta, NumericMatrix X, NumericMatrix Y, double lambda_beta, NumericMatrix lambda_beta_mat, double convergence, int maxit){ int n = X.nrow(), nX = X.ncol(), nY = Y.ncol(); // Convert matrices without reusing memory: arma::mat X_(X.begin(), n, nX, false); // reuses memory and avoids extra copy arma::mat Y_(Y.begin(), n, nY, false); // reuses memory and avoids extra copy arma::mat kappa_(kappa.begin(), nY, nY, false); // reuses memory and avoids extra copy // new matrices: arma::mat S_ = trans(X_) * X_; NumericMatrix S = as(wrap(S_)); arma::mat H_ = trans(X_) * Y_ * kappa_; NumericMatrix H = as(wrap(H_)); // Ridge: NumericMatrix beta_ridge = beta_ridge_C(X, Y, lambda_beta); double ridgecriterium = 0; for (int j=0; j (convergence * ridgecriterium)); if (it >= maxit){ Rcpp::Rcout << "\nModel did NOT converge in inner loop"; } return(beta_new); } // [[Rcpp::export]] double VAR_logLik_C(NumericMatrix X, NumericMatrix Y, NumericMatrix kappa, NumericMatrix beta){ // http://webspace.qmul.ac.uk/aferreira/lect2-var2_handout.pdf int T = X.nrow(); int nX = X.ncol(), nY = Y.ncol(); // Convert matrices without reusing memory: arma::mat X_arma(X.begin(), T, nX, false); arma::mat Y_arma(Y.begin(), T, nY, false); arma::mat kappa_arma(kappa.begin(), nY, nY, false); arma::mat beta_arma(beta.begin(), nY, nX, false); double sum = 0; for (int t=0; t