1

我正在尝试编写一个 R 程序来优化一个函数,但我总是得到 gamma(k+1) NaNs 产生的警告。我不知道为什么,因为 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 回答