1

関数を最適化する R プログラムを作成しようとしていますが、常に gamma(k+1) NaNs generated という警告が表示されます。k+1 は非常に小さいがゼロではないはずなので、その理由はわかりません。コードは次のとおりです。

x<-rlnorm(100,0,1)
y<-x/(1+x)
bernsum<-array(1:100)
cvise1<-array(1:100)
cvise2=0
cvise<-0
bernsum_temp1=0
bernsum_temp2=0
cvise1_temp1=0
cvise1_temp2=0

func_bernise<-function(bigm)
{
  #Calculate the second part of CVISE
  for (i in 1:100)
{
    z<-y[-i]
    for (j in 1:99)
    {
      for (k in 0:bigm-1)
      {
         bernsum_temp1=bernsum_temp1+bigm*((sum(z[j]<=(k+1)/bigm)-sum(z[j]             
<=k/bigm))/100)*(gamma(bigm)/(gamma(k+1)*gamma(bigm-k+1)))
*(z[j]^k)*((1-z[j])^(bigm-k-1))/50

       }
      bernsum_temp2<-bernsum_temp2+bernsum_temp1
      bernsum_temp1=0
}
bernsum[i]=bernsum_temp2
bernsum_temp2=0
 }



cvise=sum(bernsum)#+sum(cvise1)
return(cvise)
}

bigmtrue=optimize(func_bernise,c(1,15))

前もって感謝します!k は 0 から bigm-1 であり、bigm は 1 から 15 に最適化されていることがわかります。これにより、k+1 も 1 から 15 になります。

4

2 に答える 2

3

関数を呼び出すには、関数内で使用されるすべての変数を渡す必要があります。または、変数が使用され、関数の実行の最後に破棄される場合は、変数を関数内で定義/初期化する必要があります。

たとえば、変数を関数に渡さずに関数内で次を使用します。

y
bernsum_temp1      #this is used in an assignment without being initialized

関数の書き込みでこれを確認できます。

EDIT1:NaNが生成される理由は次のとおりであることを忘れていました。

gamma(0) = NaN

したがって、次の値がゼロの場合の最初のパススルーで、エラーが発生します

  • bigm-k+1
于 2013-04-27T21:22:51.560 に答える
0

私は問題を抱えていると思います。最適化ルーチンは、「bigm」を整数以外の値に設定します。したがって、問題を解決するには for (k in 0:round(bigm-1)) を使用する必要があります。整数に焦点を当てた他の最適化ルーチンがあればいいのにと思います。

于 2013-04-26T21:08:07.357 に答える