SAUDAÇÕES!

Seja bem vindo à página do professor Pedro Albuquerque. Para saber mais sobre meu currículo, disciplinas ministradas e interesses de pesquisa, navegue no menu disponível no topo da página.

terça-feira, 15 de agosto de 2017

RcppEigen: Operações Matriciais e Rcpp - Parte 3

A biblioteca RcppEigen é uma das mais eficientes para o cômputo numérico de operações algébricas uma vez que utiliza algortimos optimizados para a memória cache e SIMD.

Por exemplo, considere o desafio de estimar uma Matriz de Variâncias e Covariâncias com base em um conjunto de dados. Essa estimação levaria em conta pelo menos $N\times(N-1)/2$ operações (calculando todas as variâncias e covariâncias na matriz triangular uma vez que a matriz é simétrica). Esse procedimento levaria em consideração o uso de loops aninhados (nested loops) os quais podem ser muito ineficientes e demorados quando implementados diretamente em R.

Nesse sentido, podemos usar as operações do pacote RcppEigen também documentadas na página do Eigen C++:

// [[Rcpp::export]]
#include 
// [[Rcpp::depends(RcppEigen)]]
#include 
using namespace Rcpp;

// [[Rcpp::export]]
Eigen::MatrixXd covCalcula(Eigen::MatrixXd mat) {
  //Centra as variáveis com respeito a média
  Eigen::MatrixXd centered = mat.rowwise() - mat.colwise().mean();
  //Calcula a covariância
  Eigen::MatrixXd cov = (centered.adjoint() * centered) / double(mat.rows() - 1);
  return cov;
}

Observe que as operações .rowwise() e .colwise() se referem, respectivamente, aos cômputos para cada linha e para cada coluna. Já o método .adjoint() calcula a Matriz Adjunta.

A invocação desse método no R é realizada da seguinte forma:

#Limpa o Working Directory
#Chama um conjunto de dados
data("ChickWeight")
#Converte todas as variáveis para numeric
dat2 <- data.frame(lapply(ChickWeight, function(x) as.numeric(as.character(x))))
#Transforma para matriz
mat<-as.matrix(dat2)
#Calcula a matriz de covariância
covCalcula(mat)