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)
Nenhum comentário:
Postar um comentário