2017-01-19 1 views
0

Ich möchte ein montecarlo-Resampling-Schema unter Verwendung der Multicore-Funktion des foreach-Pakets in Kombination mit Paket doMC unter Verwendung einer LINUX-Maschine durchführen. Bei jeder Iteration wird eine selbst erstellte Funktion erneut mit Ersatzdaten in data.frame X abgetastet. Als Ergebnis erhalte ich einen neuen data.frame X.i, der das Pseudo-Sample enthält, das als Eingabedaten in einen Optimierungsprozess unter Verwendung von nlminb() (Zielfunktion = F_1) verwendet wird. Ich habe kein Problem mit dem Standard for() Befehl:nlminb() erkennt Eingabedaten nicht, wenn in foreach() eingebettet

B=10 # number of iterations in the for(), foreach() loops 
ll<-numeric(B) # vector containing the objective value from nlminb() at iteration i. 

for (i in 1:B){ 
       X.i<-f_bwhv(X,resampling=T) 
       ll[i]<-nlminb(par,F_1,X.i=X.i)$objective 
       } 
ll 
[1] 55160.06 65839.87 50232.35 74536.11 73489.52 80321.76 61646.76 61899.84 76774.73 74138.7 

Allerdings bin ich nicht in der Lage foreach() anzuwenden, da es scheint, dass nlminb() nicht die Eingabedaten X.i, erkennt oder zumindest nicht schafft es nicht in die gleiche Art und Weise wie bei der eingebettet in for():

doMC::registerDoMC(cores=2) 

ll.foreach<-foreach(i=1:B,.packages = c("stats","plyr"),.combine = c) %dopar% { 
       X.i<-f_bwhv(X,resampling=T) 
       nlminb(par,F_1,X.i=X.i)$objective 
       } 

Error in { : task 1 failed - "object 'X.i' not found" 

ich weiß nicht, wo das Problem ist, aber ich denke, es ist etwas speziell mit wie foreach() und nlminb() interact gerecht sein müssen, denn wenn ichlaufenmit einer einfachen Funktion kann sagen, misst die Anzahl der Zeilen in Xi, habe ich überhaupt kein Problem:

nrows.foreach<-foreach(i=1:B, .packages = c("stats","plyr"), .combine = c) %dopar% { 
       X.i<-f_bwhv(X,resampling=T) 
       nrow(X.i) 
       } 

nrows.foreach 
118 118 116 116 118 117 116 115 108 113 

ich mit dem foreach Paket nicht vertraut bin, und ich konnte keine Lösung in der finden Pakethilfe, daher würde ich mich sehr über Ihre Vorschläge freuen.

Früher habe ich hier:

R Version 3.3.0 (2016.05.03); DoMC Version 1.3.4; foreach Version 1.4.3; Plattform: x86_64-pc-linux-gnu (64-bit)

Antwort

1

Ich fand das Problem von mir selbst, will es nur teilen, falls jemand in das gleiche Problem fällt. Nach mehreren Versuchen erkannte ich, dass das Problem darin bestand, wie ich F_1 definiert habe. Ursprünglich habe ich die Funktion wie folgt spezifiziert:

F_1<-function(par,...){*some calculations involving par and X.i* } 

Verwenden Sie die, ..., um X.i in die Funktion zu übergeben. Dies funktionierte immer für mich in anderen Routinen. Die Lösung kam einfach durch den Header der Funktion in dieser Art und Weise zu verändern:

F_1<-function(par,X.i){*some calculations involving par and X.i* } 

Prost

Verwandte Themen