Uma das vantagens de se trabalhar com o RcppEigen e Rcpp, além da velocidade, é o fato de que não é necessário implementar todas as funções de interesse em C++. Podemos importar funções já existentes do R para que essas sejam executadas no ambiente Rcpp.
Por exemplo, um problema comum na formação de portfólios é o fato das matrizes de correlações estimadas entre os retornos dos ativos não ser Positivas Definidas. Nesses casos, problemas teóricos e numéricos podem surgir impedindo a obtenção de uma solução ótima para o problema de alocação de portfólios. Higham, N. (2002) propôs uma abordagem numérica para se encontrar a matriz Positiva Definida mais próxima da matriz de ineteresse.
Essa função está disponível no pacote Matrix e é denominada nearPD. Podemos importá-la no ambiente Rcpp da seguinte forma:
// [[Rcpp::export]]
Eigen::MatrixXd nearPDefinite(Eigen::MatrixXd X, int maxit=1e+6, double eigtol = 1e-06, double conv_tol = 1e-07, double posd_tol = 1e-08, bool keepDiagonal=false){
//Cria o objeto com o Environment.
Rcpp::Environment G = Rcpp::Environment::global_env();
//Objeto com as informações do pacote Matrix
Rcpp::Environment Matrix("package:Matrix");
//Importa a função de ineteresse
Function f = Matrix["nearPD"];
//Obtêm o resultado da função nearPD
Rcpp::List res = f(X, false, keepDiagonal, true, false, true, false, false, eigtol, conv_tol, posd_tol, 100, "I", false);
//Pega o primeiro elemento da lista e transforma para matrix
Rcpp::NumericMatrix mat = internal::convert_using_rfunction(wrap(res[0]), "as.matrix");
//Converte de Rcpp::NumericMatrix para Eigen::MatrixXd
Eigen::MatrixXd Xpd=convertMatrix(mat);
//Retorna o resultado
return(Xpd);
}
A função anterior, após compilada, pode ser utilizada no ambiente R de maneira direta pelo nome nearPDefinite. Entretanto, é necessário que a biblioteca Matrix tenha sido habilitada e esteja disponível no environment do R para que seja utilizada. Essa estratégia pode ser para outras funções de outros pacotes também.

Nenhum comentário:
Postar um comentário