1

nlm関数を使用して2つのパラメーターを推定する必要があります。

fit<-nlm(hood2par,c(x01[i],x02[j]),iterlim=300, catch=x[,c(3,4,5)],sp=.5)

hood2par変更されたロジスティックはどこですか

nlmの収束は、これらのパラメーターの開始値に依存します。そのような初期値を見つけるために、私は開始値の2つのベクトルを自動的に生成します

x01 = seq(-10,-20,-0.1)
x02 = seq(0.1,0.9,0.01)

次に、関数の収束につながる値を見つけるために、double for()に含まれるルーチンを作成します:

for (i in 1:length(x01)) { for (j in 1:length(x02)) {

fit <- NULL
try(fit <- nlm(hood2par, c(x01[i],x02[j]), iterlim = 300, catch = x[,c(3,4,5)],
               sp = .5), 
    silent = TRUE)
stopifnot(is.null(fit))}} 

私が抱えている問題は、前のルーチンを関数に含めると、次のようになることです。

FFF <- function(x01, x02, catch){
    for (i in 1:length(x01)) { 
        for (j in 1:length(x02)) {
            fit <- NULL
            try(fit <- nlm(hood2par, c(x01[i], x02[j]), iterlim = 300,
                           catch = x[,c(3,4,5)], sp = .5), 
               silent = TRUE) # does not stop in the case of err
            stopifnot(is.null(fit))
        }
     }  
return(fit)
}

FFF()から「fit」値を取得できません。

> fit.fff<-FFF(x01,x02,catch)
#Error: is.null(fit) is not TRUE 

>fit.fff
fit.fff
Error: object 'fit.fff' not found

以前stopifnot(is.null(fit))は、fitがNULLでない場合にループを停止していました(fitはtry(...)の前にNULLオブジェクトとして定義されているため)。あなたが共有したtryコードに関しては、私はこれが必要です。

res <- try(some_expression)
if(inherits(res, "try-error"))
{
  #some code to keep loops running
} else
{
  #stop the loops and gather "res" 
}

breakcondictionalの2番目の引数に関数を含めようとしましたが、Rバージョンでは実行されません...何か考えはありますか?

4

1 に答える 1

4

を呼び出すとFFF、try ブロック内で if がnlm正常に完了すると、fitが割り当てられ、stopifnot条件がアクティブになり、エラーがスローされます。

勝手な推測ですが、もしかして

stopifnot(!is.null(fit))

今後の参考のために、使用する標準的なコードのチャンクは次のとおりtryです。

res <- try(some_expression)
if(inherits(res, "try-error"))
{
  #some error handling code
} else
{
  #normal execution
}
于 2011-08-24T11:07:51.017 に答える