2014-06-14 4 views
5

Innerhalb von R kann rpois ein Vektor von Lambdas übergeben werden, der mehrere Poisson-Verteilungen beschreibt, z.Übergeben eines Vektors von Lambdas an Rcpps rpois

rpois(5, (1:5)*1000) 

# [1] 1043 1974 3002 3930 4992 

Above, wobei jedes Element des Ausgangsvektors wird aus einer anderen Poisson-Verteilung gezogen, mit Hilfe von 1000, 2000, 3000, 4000 und 5000, beziehungsweise.

Wenn ich einen arma::mat (mit diesen, weil anderswo verwende ich Cubes) Lambda von Poisson-Verteilungen, was ist der beste Weg, um diese (eine Reihe zu einer Zeit) zu rpois in Rcpp übergeben?

Hier ist ein Spielzeug Beispiel, und ein Auszug aus der folgenden Fehlermeldung:

library(inline) 
library(RcppArmadillo) 
code <- " 
    using namespace Rcpp; 
    using namespace arma; 
    arma_rng::set_seed(42); // Dirk's seed of choice 

    mat lam = randu(5, 5); // ignore the fact these are all 0-1 
    mat out(5, 5); 

    for (int i = 0; i < 5; i++) { 
    out.row(i) = rpois(5, lam.row(i)); 
    }  

    return(wrap(out)); 
" 

f <- cxxfunction(body=code, plugin="RcppArmadillo") 

# cannot convert 'arma::subview_row<double>' to 'double' for argument '2' 
# to 'Rcpp::NumericVector Rcpp::rpois(int, double)' 

Ich muß mein Verständnis von Typ-Konvertierung in c zugeben ++ ist ziemlich schlecht. Ist das, was ich versuche, möglich (meine Vermutung ist nein, da es so aussieht, als ob rpois ein Doppel erwartet), oder muss ich über jede Zelle der Matrix iterieren, wobei jedes Mal eine einzige Abweichung erzeugt wird?

Antwort

6

Von C/C++ haben Sie Zugriff auf mindestens 2 Poisson-Abweichungsgenerierungsroutinen (suchen Sie in diesem online manual nach rpois).

ihre Erklärungen sind wie folgt:

double R::rpois(double mu); 
NumericVector Rcpp::rpois(int n, double mu); 

Keine von ihnen ermöglicht die Weitergabe> 1 Werte in mu (a.k.a. lambda). Die erste Funktion ist die ursprüngliche Routine von R, die zum Implementieren von rpois verwendet wird, wie es aus dem Paket Rstats bekannt ist (dasjenige, das mit allen seinen Argumenten vektorisiert wird). Mit einer einzigen mu gibt es eine einzelne (Pseudo-) zufällige Abweichung zurück. Die zweite ist die so genannte Rcpp Zuckerfunktion. Es erlaubt, n zu berechnen, die gleichzeitig abweicht und sie als NumericVector zurückgibt (wieder, indem man R::rpois verwendet).

Mit anderen Worten, Sie sollten lieber zwei verschachtelte for Schleifen verwenden, um eine Matrix zu füllen, indem Sie R::rpois aufrufen. Haben Sie keine Angst vor solch einem Ansatz, das ist C++. :)

+0

Eine sehr nützliche Antwort, danke. Und ein guter Tipp zum Durchsuchen des Online-Handbuchs "Rcpp". Ich habe Ihren vorgeschlagenen Ansatz jetzt implementiert und es funktioniert gut :). – jbaums