2016-06-03 10 views
0

Ich möchte Adaptive Metropolis Ablehnung Stichprobe (AMRS) für meine Gibbs Stichprobe verwenden. Ich könnte das Paket HI in R direkt verwenden und den Algorithmus verwenden. Da ich jedoch zu viele Parameter habe, ist die Abtastung in einer Schleife in R ziemlich langsam. Also überlege ich, den gesamten Sampling-Part in Rcpp zu schreiben. Das Problem besteht darin, wie die AMRS-Funktion in Rcpp zu verwenden ist. Eine Möglichkeit besteht darin, eine Möglichkeit zu finden, die R-Funktion in Rcpp zu verwenden, aber sie wird langsam sein. Dann fand ich den Original-C-Code in der SeiteLink Rcpp mit C-Code für Adaptive Metropolis Ablehnung Stichproben

[1]: AMRS http://www1.maths.leeds.ac.uk/~wally.gilks/adaptive.rejection/web_page/Welcome.html

So wird die Frage sein, wie der C-Code mit RCPP zu integrieren. Wenn ich um "Anruf C in C++" suche, sind diese alle über Compilieren C zuerst, dann C++, dann Link. Allerdings weiß ich nicht, wie das in Rcpp zu tun ist, da die Kompilierung stattfindet, wenn ich SourceCpp verwendete. Kann mir jemand Vorschläge geben, wie das geht?

Antwort

2

Überprüfen Sie, wie HI die C code in their package implementiert.

Insbesondere sollten Sie Ihre eigene Version implementieren:

SEXP arms(SEXP bounds, SEXP myldens, SEXP yprev, SEXP size, SEXP rho); 

Die in https://github.com/cran/HI/blob/master/src/arms-R.c#L86-L172

In diesem Fall gegeben ist, sollten Sie sich für das SEXP Objekt mit den entsprechenden Rcpp Datentypen ersetzen entscheiden:

/* bounds  : boundaries of the support of the density */ 
/* myldens  : R function to evaluate log density */ 
/* yprev  : previous value from markov chain */ 
/* size  : number of sampled values to be obtained */ 
/* rho   : R environment in which the logdensity is evaluated */ 

Hinweis: Die Umset tation sollte wirklich paketbasiert statt sourceCpp()

+0

ja - Ausgehend von einem Arbeitspaket, und das Hinzufügen der Skelett-Komponenten Rcpp braucht (z. B. in der Beschreibung, NAMESPACE, etc) sollte ein schön verbessertes Paket erhalten, vielleicht mit einem starten einfaches (r) Rcpp-Paket zuerst. –

+0

Vielen Dank für die Antwort. Ich habe mir den Code angesehen und Ihre Methode ist definitiv machbar. Jedoch habe ich am Ende die C-Header in C++ aufgerufen und den Code geändert, der die C-Funktion anwendet (da in C++ ein Void-Zeiger gegossen werden muss), dann hat es funktioniert. Ich werde später ein Paket machen, aber im Moment bleibe ich einfach bei SourceCpp .... da es einige Zeit dauern wird, um herauszufinden, wie man einen macht. Und die Geschwindigkeit in C++ ist unglaublich schnell, mit 10 Sekunden anstatt mehr als 30 Minuten in R. –

+0

@JiangDu Ich würde gerne die Lösung sehen, die Sie gefunden haben. Bitte posten Sie in Zukunft einen Link =) – coatless

Verwandte Themen