forループをlapplyに置き換えてコードを高速化しようとしています。私は多くの異なるサンプルでnlsモデルを実行しており、coefsを抽出していますが、いくつかのサンプルはいくつかのモデルが収束していません。私はこれらのサンプルを無視するtrycatchのforループでこれを処理できますが、lapplyで動作するようにはできません。私がこれを実行すると、私はsample.codeとNULLのリストを取得します。返す場所はどこですか(nls.dat)?私はNULLを終わらせるわけではありませんか?lapplyとtrycatchからのNULL出力
test.func <- function (SCDF){
tryCatch({
mod.allDIDO <- nlsLM (BM~Cr*(1 - R * exp(-Kr*day) - (1 - R) * exp(-Kr2*day)), data=dat[dat$sample.code %in% SC,], start=list(Cr=DI.Cr,R=DI.r,Kr=DI.Kr,Kr2=DI.Kr2),
control = nls.lm.control(maxiter = 500), lower = c(-Inf, 0, 0, 0), upper = c(Inf, 1, Inf, Inf))
nls.dat <- c("df", coef(mod.allDIDO)[1], coef(mod.allDIDO)[2], coef(mod.allDIDO)[3], coef(mod.allDIDO)[4], deviance(mod.allDIDO), logLik(mod.allDIDO))
return (nls.dat)
}, error = function(e){})
}
test1 <- lapply(split(dat, dat$sample.code), test.func)
編集いくつかのデータを含めるとカールに返信する: 私はあなたの提案(カール)を試してみましたが、私はまだNULLを取得し、に注意を払う事で、あなたのある削減バージョン
x1 <- 0:60
y1 <- 774*(1 - 0.5 * exp(-0.2*x1) - (1 - 0.5) * exp(-0.016*x1))
test.dat <- data.frame (x1, y1)
nls.dat <- tryCatch({
mod.allDIDO <- nlsLM(y1~Cr*(1 - R * exp(-Kr*x1) - (1 - R) * exp(-Kr2*x1)),
data=test.dat,
start=list(Cr=774,R=0.5,Kr=0.2,Kr2=0.016),
control = nls.lm.control(maxiter = 500),
lower = c(-Inf, 0, 0, 0),
upper = c(Inf, 1, Inf, Inf))
nls.dat <- c("df", coef(mod.allDIDO)[1],
coef(mod.allDIDO)[2],
coef(mod.allDIDO)[3],
coef(mod.allDIDO)[4],
deviance(mod.allDIDO),
logLik(mod.allDIDO))
return(nls.dat)
}, error = function(e){})
nls.dat ## NULL
こんにちはカール、私はあなたの提案を試みたが、出力はまだNULLであった、編集された質問のカットダウンバージョンといくつかのデータを参照してください。上記の – chris20
は編集後...データをありがとう。また、あなたが使用しているパッケージをインクルードしていれば、 'minpack.lm'を捜しておいても役に立ちます。なぜ論理的な二重取りが有用であるのかという手掛かりはありませんが、それは機能します。 –
Carlさん、ありがとう、申し訳ありません、私はパッケージを追加するのを忘れました。 – chris20