2014-06-14 13 views
5

Wewnątrz R, rpois może być przekazany wektor lambdas opisujący wiele rozkładów Poissona, np.Przekazywanie wektora lambd do rpois Rcppa

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

# [1] 1043 1974 3002 3930 4992 

powyżej, każdy element wektora wyjściowego pochodzi z innego rozkład Poissona, środki 1000, 2000, 3000, 4000 i 5000, odpowiednio.

Jeśli mam(używając tych, ponieważ gdzie indziej używam kostek) zawierających lambdy z rozkładów Poissona, jaki jest najlepszy sposób przekazania tych znaków (jeden wiersz na raz) do rpois w Rcpp?

Oto przykład zabawki, a wyciąg z następującego komunikatu o błędzie:

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)' 

Muszę przyznać, moje rozumienie typu konwersji w C++ jest dość słaba. Czy to, co próbuję zrobić możliwe (domyślam się, że nie, ponieważ wydaje się, że rpois spodziewa się podwójnego), czy też muszę przetestować każdą komórkę macierzy, generując pojedyncze odchylenie za każdym razem?

Odpowiedz

6

Od C/C++, masz dostęp do co najmniej 2 rutynowych generacji odchyleń Poissona (wyszukaj rpois w tym online manual).

Ich zgłoszenia są w następujący sposób:

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

Żaden z nich nie pozwala na przechodzącej> 1 Wartości w mu (a.k.a. lambda). Pierwszą funkcją jest oryginalna procedura R, używana do implementacji rpois, jak wiemy z pakietu R stats (ten, który jest wektoryzowany w.r.t., wszystkie jego argumenty). Biorąc pod uwagę pojedyncze mu, zwraca pojedyncze (pseudo) losowe odchylenie. Jest to tak zwana funkcja cukru o nazwie Rcpp. To pozwala obliczyć n odchyla się w czasie i zwrócić je jako NumericVector (ponownie, za pomocą R::rpois).

Innymi słowy, powinieneś raczej użyć dwóch zagnieżdżonych pętli for do wypełnienia macierzy, dzwoniąc pod numer R::rpois. Nie bój się takiego podejścia, to jest C++. :)

+0

Bardzo przydatna odpowiedź, dziękuję. I świetna wskazówka na temat przeszukiwania podręcznika 'Rcpp'. Zaimplementowałem Twoje sugerowane podejście teraz i działa dobrze :). – jbaums