如何解决数值积分中的NaN问题?

时间:2021-02-26 05:53:35

标签: r integral

我想计算以下函数的数值积分

library(cubature)
library(dplyr)
fun4=function(y1,y2,b0,b1,x)
{
  y=c(y1,y2)
  num=   lapply(1:length(b0), function(u) exp(b0[[u]] + t(b1[[u]])%*%y ) )
  num_l=lapply(1:length(x), function(u)  nth(num[[u]], x[u])  )
  den =  lapply(1:length(b0), function(u) 1+ sum(num[[u]]) )
  pp =  lapply(1:length(b0), function(u)  num_l[[u]] / den[[u]]  )
  gpp=unlist(pp)
  res=prod(gpp)
}

我使用了 hcubature 但我得到了 NaN

  x2=c(1,3)
  b01=c(1,3,-3)
  b02=c(2,-2,0)
  b11=matrix(c(1,2,3,-2,1,0),ncol=3,nrow=2)
  b12=matrix(c(2,-2,3,1,0,4),ncol=3,nrow=2)
  beta0=list(b01,b02)
  beta1=list(b11,b12)
  fintg = function(X){
    y1=X[1]
    y2= X[2]
    z= X[3]
   log(z)*fun4(y1,y2,beta0,beta1,x2) 
  }
  loLimt = c(-Inf, -Inf,0)
  hiLimt = c( Inf, Inf,Inf)
  hcubature(fintg, loLimt, hiLimt)$integral 

我不知道为什么我得到 NaN,但我查看了包含 similar problem NaN 的这个问题,其中一个答案提到如果 y 太大,函数 exp(y)/1+exp(y) 会四舍五入为 NaN。我的函数的一部分与该函数类似,exp(b0 + t(b1)%*%y )/ 1+sum(exp(b0 + t(b1)%*%y )) .我不知道如何在我的函数中添加 ifelse 条件,或者是否有其他方法可以解决 NaN 问题。

1 个答案:

答案 0 :(得分:0)

您的 num 正在抛出 Inf,这会导致 NaN。将 Inf 替换为 1 对您有用吗?

fun4=function(y1,y2,b0,b1,x)
{
  y=c(y1,y2)
  num=  lapply(1:length(b0), function(u) exp(b0[[u]] + t(b1[[u]])%*%y ) )

  num2=unlist(num)
  if(Inf %in% abs(num2)) num2[num2==Inf | num2==-Inf]=1
  num=list(as.matrix(num2[1:3]),as.matrix(num2[4:6]))
  
  num_l=lapply(1:length(x), function(u)  nth(num[[u]], x[u])  )
  den =  lapply(1:length(b0), function(u) 1+ sum(num[[u]]) )
  pp =  lapply(1:length(b0), function(u)  num_l[[u]] / den[[u]]  )
  gpp=unlist(pp)
  res=prod(gpp)
  res
}
相关问题