2014-06-14 9 views
5

आर के भीतर लैम्बडास के वेक्टर को पास करना, rpois को कई पोइसन वितरणों का वर्णन करने वाले लैम्बडास के वेक्टर को पारित किया जा सकता है, उदाहरण के लिएआरसीपीपी के आरओपीआई

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

# [1] 1043 1974 3002 3930 4992 

ऊपर, उत्पादन वेक्टर के प्रत्येक तत्व 1000, 2000, 3000, 4000 और 5000 में क्रमश: के साधन के साथ एक अलग प्वासों बंटन से ली गई है,।

तो मेरे पास है एक arma::mat (इन का उपयोग कर, क्योंकि कहीं और मैं क्यूब्स उपयोग कर रहा हूँ) प्वासों वितरण के lambdas युक्त, क्या Rcpp भीतर rpois करने के लिए इन (एक समय में एक पंक्ति) पारित करने के लिए सबसे अच्छा तरीका है?

यहाँ एक खिलौना उदाहरण है, और आगामी त्रुटि संदेश से एक अंश:

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

मैं ग में जैसे रूपांतरण की मेरी समझ स्वीकार करना होगा ++ काफी खराब है। क्या मैं संभव करने की कोशिश कर रहा हूं (मेरा अनुमान नहीं है, क्योंकि ऐसा लगता है कि rpois एक डबल की उम्मीद कर रहा है), या क्या मुझे मैट्रिक्स के प्रत्येक सेल पर पुनरावृत्ति करने की ज़रूरत है, जिससे हर बार एक विचलन उत्पन्न होता है?

उत्तर

6

सी/सी ++ से, आपके पास कम से कम 2 Poisson deviate generation routines तक पहुंच है (में rpois के लिए खोजें)।

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

उनमें से कोई भी mu (यानी लैम्ब्डा) में निधन> 1 मूल्यों के लिए अनुमति देता है:

उनकी घोषणाओं इस प्रकार हैं। पहला कार्य आर की मूल दिनचर्या है, जिसे rpois लागू करने के लिए उपयोग किया जाता है जैसा कि हम आर stats पैकेज (जिसे वेक्टरकृत w.r.t. के सभी तर्कों से वेक्टर किया गया है) से जानते हैं। एक mu को देखते हुए, यह एक एकल (छद्म) यादृच्छिक विचलन देता है।

दूसरा एक तथाकथित Rcpp चीनी कार्य है। यह एक समय में n विचलन की गणना करने की अनुमति देता है और उन्हें NumericVector (फिर से, R::rpois का उपयोग करके) के रूप में वापस करने की अनुमति देता है।

दूसरे शब्दों में, आपको R::rpois पर कॉल करके मैट्रिक्स भरने के लिए दो नेस्टेड for लूप का उपयोग करना चाहिए। इस तरह के दृष्टिकोण से डरो मत, यह सी ++ है। :)

+0

एक बहुत ही उपयोगी उत्तर, धन्यवाद। और ऑनलाइन 'आरसीपीपी मैनुअल' खोजने के बारे में एक महान युक्ति। मैंने अब आपके सुझाए गए दृष्टिकोण को लागू किया है और यह ठीक काम कर रहा है :)। – jbaums

संबंधित मुद्दे