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++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // [[Rcpp::export]] #include <rcppeigen.h> // [[Rcpp::depends(RcppEigen)]] #include <cmath> 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; } </cmath></rcppeigen.h> |
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:
1 2 3 4 5 6 7 8 9 | #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) |