2014-06-14 20 views
5

Trong vòng R, rpois có thể được truyền một vectơ lambdas mô tả nhiều bản phân phối Poisson, ví dụ:Truyền một vectơ lambdas tới Rcpp's rpois

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

# [1] 1043 1974 3002 3930 4992 

Ở trên, mỗi phần tử của vector đầu ra được rút ra từ một phân phối Poisson khác nhau, với phương tiện 1000, 2000, 3000, 4000 và 5000, tương ứng.

Nếu tôi có một arma::mat (sử dụng những thứ này vì ở nơi khác tôi đang sử dụng hình khối) có chứa lambdas phân phối Poisson, cách tốt nhất để vượt qua (một hàng tại một thời điểm) là rpois trong Rcpp là gì?

Dưới đây là một ví dụ đồ chơi, và một đoạn trích từ thông báo lỗi tiếp theo:

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

Tôi phải thừa nhận sự hiểu biết của tôi về loại chuyển đổi trong C++ là khá nghèo. Là những gì tôi đang cố gắng để làm có thể (tôi đoán là không, vì có vẻ như rpois đang mong đợi một đôi), hoặc tôi cần phải lặp qua mỗi tế bào của ma trận, tạo ra một deviate duy nhất mỗi lần?

Trả lời

6

Từ C/C++, bạn có quyền truy cập vào ít nhất 2 thói quen tạo Poiate lệch (tìm kiếm rpois trong số online manual) này.

tờ khai của họ như sau:

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

Không ai trong số họ cho phép đi qua> 1 giá trị trong mu (lambda a.k.a.). Hàm đầu tiên là thói quen ban đầu của R, được sử dụng để thực hiện rpois như chúng ta biết từ gói R stats (một trong đó được vector hóa tất cả các đối số của nó). Với một đơn mu, nó trả về một sai lệch ngẫu nhiên đơn (giả).

Cách thứ hai là hàm gọi là Rcpp đường. Nó cho phép tính toán n lệch tại một thời điểm và trả lại chúng dưới dạng NumericVector (một lần nữa, bằng cách sử dụng R::rpois).

Nói cách khác, bạn nên sử dụng hai vòng lặp for lồng nhau để điền vào ma trận, bằng cách gọi R::rpois. Đừng sợ cách tiếp cận như vậy, đây là C++. :)

+0

Câu trả lời rất hữu ích, cảm ơn bạn. Và một mẹo tuyệt vời để tìm kiếm hướng dẫn trực tuyến 'Rcpp'. Tôi đã thực hiện phương pháp được đề xuất của bạn ngay bây giờ và nó hoạt động tốt :). – jbaums

Các vấn đề liên quan