Я надеялся, что кто-нибудь сможет быстро взглянуть на этот пример и помочь мне найти лучший и более эффективный способ решения этой проблемы. Я хочу запустить симуляцию, чтобы изучить, как животное перемещается между участками в соответствии с набором определенных условий. У меня есть 5 сайтов и несколько начальных вероятностей,
N<-5 # number of sites sites<-LETTERS[seq(from=1,to=N)] to.r<-rbind(sites) p.move.r<-seq.int(0.05,0.95,by=0.1) # prob of moving to a new site p.leave<-0.01*p.move.r # prob of leaving the system w/out returning p.move.out<-0.01*p.move.r # prob of moving in/out p.stay<-1-(p.move.r+p.leave+p.move.out) # prob of staying in the same site
Для этого примера я включил только 50 симуляций, но на самом деле я хотел бы иметь по крайней мере 1000 симуляций,
set.seed(13973) reps<-50 # number of replicates/simulations steps<-100 # number of time steps (hours, days, weeks, etc) random<-runif(10000,0,1) # generating numbers from a random distribution # Construct empty df to fill with data rep.movements<-matrix(NA,nrow=reps,ncol=steps) colnames(rep.movements)<-c(1:steps);rownames(rep.movements)<-c(1:reps) rep.use<-matrix(NA,nrow=reps,ncol=N) colnames(rep.use)<-c(reefs);rownames(rep.use)<-c(1:reps) # Outer loop to run each of the initial parameters for(w in 1:length(p.stay)){ p.move<-matrix((p.move.r[w]/(N-1)),N,N) diag(p.move)<-0 # Construction of distance matrix move<-matrix(c(0),nrow=(N+2),ncol=(N+2),dimnames=list(c(sites,"NA","left"),c(sites,"NA","left"))) from<-array(0,c((N+2),(N+2)),dimnames=list(c(sites,"NA","left"),c(sites,"NA","left"))) to<-array(0,c((N+2),(N+2)),dimnames=list(c(sites,"NA","left"),c(sites,"NA","left"))) # Filling movement-Matrix construction for(from in 1:N){ for(to in 1:N){ if(from==to){move[from,to]<-p.stay[w]} else {move[from,to]<-p.move[from,to]} move[,(N+1)]<-(1-(p.leave[w]+p.move.out[w]))/N move[,(N+2)]<-(1-(p.leave[w]+p.move.out[w]))/N move[(N+1),]<-p.move.out[w] move[(N+2),]<-p.leave[w] }
}
Идея состоит в том, чтобы использовать эту кумулятивную матрицу вероятностей для определения судьбы животного на основе случайного числа.
cumsum.move<-cumsum(data.frame(move)) # Cumulative sum of probabilities
В этой кумулятивной матрице буквы «A», «B», «C», «D» и «E» представляют разные сайты, «NA» представляет вероятность ухода и возвращения на будущем временном шаге, а «покинуло» представляет вероятность покинуть систему и не вернуться обратно. Затем я использую список случайных чисел для сравнения с совокупной матрицей вероятностей и определения «судьбы» этого конкретного животного.
for(o в 1:повторениях){
result<-matrix(as.character(""),steps) # Vector for storing sites x<-sample(random,steps,replace=TRUE) # sample array of random number time.step<-data.frame(x) # time steps used in the simulation (i) colnames(time.step)<-c("time.step") time.step$event<-"" j<-sample(1:N,1,replace=T) # first column to be selected k<-sample(1:N,1,replace=T) # selection of column for ind. that move in/out for(i in 1:steps){ for (t in 1:(N+1)){ if(time.step$time.step[i]<cumsum.move[t,j]){ time.step$event[i]<-to.r[t] break } } ifelse(time.step$event[i]=="",break,NA) result[i]<-time.step$event[i] j<-which(to.r==result[i]) if(length(j)==0){j<-k} } result<-time.step$event # calculate frequency/use for each replicate use<-table(result) use.tab<-data.frame(use) use.tab1<-use.tab[-which(use.tab==""),] mergeuse<-merge(use.tab2,use.tab,all.x=TRUE) mergeuse[is.na(mergeuse)]<-0 # insert data into empty matrix rep.movements[o,]<-result rep.use[o,]<-mergeuse$Freq } }
# for the outer loop I have some matrices to store the results for each parameter,
# but for this example this is not important
rep.movements rep.use
Теперь основная проблема заключается в том, что для запуска всех симуляций для каждого начального параметра (в этом примере 10 значений) требуется много времени. Мне нужно найти лучший/более эффективный способ запустить 1000 симуляций/20 сайтов по всем исходным параметрам. Я не слишком знаком с функциями или другими способами ускорить эту задачу. Любые идеи или рекомендации будут оценены.
Заранее большое спасибо,