1

nlsループにフィットするために残差のブートストラップを実行したいと思います。私はを使用nlsBootし、計算時間を短縮するために、それを並行して実行したいと思います(現時点ではWindows 7システムで)。これが私の問題を再現するいくつかのコードです:

#function for fitting
Falge2000 <- function(GP2000,alpha,PAR) {
  (GP2000*alpha*PAR)/(GP2000+alpha*PAR-GP2000/2000*PAR)
}

#some data
PAR <- 10:1600
GPP <- Falge2000(-450,-0.73,PAR) + rnorm(length(PAR),sd=0.0001)
df1 <- data.frame(PAR,GPP)

#nls fit
mod <- nls(GPP~Falge2000(GP2000,alpha,PAR),start=list(GP2000=-450,alpha=-0.73),data=df1, upper=c(0,0),algorithm="port")

#bootstrap of residuals
library(nlstools)
summary(nlsBoot(mod,niter=5))
#works

#now do it several times
#and in parallel
library(foreach)
library(doParallel)

cl <- makeCluster(1)
registerDoParallel(cl)

ttt <- foreach(1:5, .packages='nlstools',.export="df1") %dopar% {
  res <- nlsBoot(mod,niter=5)
  summary(res)

}
#Error in { : 
#task 1 failed - "Procedure aborted: the fit only converged in 1 % during bootstrapping"

stopCluster(cl)

これは環境の問題だと思います。問題のコードを確認したところ、呼び出しnlsBootで無名関数を使用したことが原因のようです。lapply

l1 <- lapply(1:niter, function(i) {
    data2[, var1] <- fitted1 + sample(scale(resid1, scale = FALSE), 
        replace = TRUE)
    nls2 <- try(update(nls, start = as.list(coef(nls)), data = data2), 
        silent = TRUE)
    if (inherits(nls2, "nls")) 
        return(list(coef = coef(nls2), rse = summary(nls2)$sigma))
})
if (sum(sapply(l1, is.null)) > niter/2) 
    stop(paste("Procedure aborted: the fit only converged in", 
        round(sum(sapply(l1, is.null))/niter), "% during bootstrapping"))

nlsBoot並列ループで使用する方法はありますか?または、関数を変更する必要がありますか?(for代わりにループを使用することもできますlapply。)

4

1 に答える 1

2

modオブジェクトの作成を%dopar%ループに移動すると、すべてが正常に機能しているように見えます。また、これによりオブジェクトが自動的にエクスポートされるため、引数df1を削除できます。.export

ttt <- foreach(1:5, .packages='nlstools') %dopar% {
  mod <- nls(GPP~Falge2000(GP2000,alpha,PAR),start=list(GP2000=-450,alpha=-0.73),data=df1, upper=c(0,0),algorithm="port")
  res <- nlsBoot(mod,niter=5)
  capture.output(summary(res))

}

ただし、何を返したいかを考え出す必要があるかもしれません。を使用capture.outputすることは、物事が機能しているかどうかを確認することsummary(res)だけでしたNULL

于 2012-11-14T22:09:13.513 に答える