Atividade: Refazer o algoritmo da seção 22.2 (nova edição) em Rcpp. A função deve retornar um dataframe com as variâncias para os casos de N 10, 100, 200, 1000. Tanto para o tradicional e com usando a técnica de redução de variância.

Código da função em Rcpp:

#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppArmadillo)]]




// [[Rcpp::export]]
arma::mat Ginv(arma::mat u) {
  arma::mat X = u.transform([](double val) { return (sqrt(2)*tan(val*atan(1/sqrt(2))));});
  return(X);
}


// [[Rcpp::export]]
arma::mat Psi(arma::mat x){

  arma::mat P = x.transform([](double val) {return (exp(-(pow(val,2))/2)*sqrt(2)*atan(1/sqrt(2))*(1+((pow(val,2))/2)));});
  return(P);
}




// [[Rcpp::export]]
arma::vec var(int N=10000,int n =50){
  
  arma::mat ua = arma::randu<arma::mat>(n,N);
  arma::mat thetaa = arma::mean((Psi(Ginv(ua))),0);
  
  arma::vec aux2 = arma::var(thetaa,0,1);
  double vara = aux2(0);
 
 
  double var1 = 1.413/n;
  
  double reduction = (100*(var1 - vara)/var1);
  
  arma::vec variances = {var1,vara,reduction};  
  
  
  return (variances);
}





// [[Rcpp::export]]
Rcpp::DataFrame variancias(){
  
  arma::Col<int> Nsize = {10,100,200,1000};
  arma::vec size1 = var(Nsize(0),50);
  arma::vec size2 = var(Nsize(1),50);
  arma::vec size3 = var(Nsize(2),50);
  arma::vec size4 = var(Nsize(3),50);
  
  arma::vec v1  = {size1(0),size2(0),size3(0),size4(0)};
  arma::vec va = {size1(1),size2(1),size3(1),size4(1)};
  arma::Col<int> redu = {(int)round(size1(2)),(int)round(size2(2)),(int)round(size3(2)),(int)round(size4(2))};
  
  
  
  
  
  Rcpp::DataFrame result = Rcpp::DataFrame::create(Rcpp::Named("N") = Nsize,
                                                   Rcpp::Named("Var.1") = v1,
                                                   Rcpp::Named("Var.I") = va,
                                                   Rcpp::Named("Reduction") = redu);
  return (result);
}

O código escrito acima é a versão em Rcpp da mesma função descrita no Jones da técnica de redução de variancia usando importance sampling. O código original em R se encontra no livro do Jones. Como saída, geramos um data frame como foi solicitado. As funções ‘Ginv’ e ‘Psi’ transformam os dados. A função ‘var’ calcula as variancias e a redução ao utilizar a técnica. Já a função ‘variancias’ gera o dataframe com as informações calculadas. Ao chamar a função variancias obtemos o dataframe que pode ser visto a seguir.

Dataframe:

 variancias()
      N   Var.1        Var.I Reduction
 1   10 0.02826 1.050402e-05       100
 2  100 0.02826 8.634446e-06       100
 3  200 0.02826 6.948158e-06       100
 4 1000 0.02826 8.565122e-06       100