&引用;“非有限函数值”;在R中使用integrate()时

&引用;“非有限函数值”;在R中使用integrate()时,r,R,我使用的是以下R代码,摘自一篇发表的论文(引文如下)。代码如下: int2=function(x,r,n,p) { (1+x)^((n-1-p)/2)*(1+(1-r^2)*x)^(-(n-1)/2)*x^(-3/2)*exp(-n/(2*x))} integrate(f=int2,lower=0,upper=Inf,n=530,r=sqrt(.245),p=3, stop.on.error=FALSE) 当我运行它时,我得到错误“非有限函数值”。然而,Maple能够将其计算为4.04

我使用的是以下R代码,摘自一篇发表的论文(引文如下)。代码如下:

int2=function(x,r,n,p) {
    (1+x)^((n-1-p)/2)*(1+(1-r^2)*x)^(-(n-1)/2)*x^(-3/2)*exp(-n/(2*x))}
integrate(f=int2,lower=0,upper=Inf,n=530,r=sqrt(.245),p=3, stop.on.error=FALSE)
当我运行它时,我得到错误“非有限函数值”。然而,Maple能够将其计算为4.046018765*10^27

我尝试在pracma包中使用“积分”,这给了我一个不同的错误: if(delta 总体目标是计算两个积分的比率,如Wetzels&Wagenmakers(2012)“相关性的默认贝叶斯假设检验”()所述。整个功能如下所示:

jzs.pcorbf = function(r0, r1, p0, p1, n) {
  int = function(r,n,p,g) {
    (1+g)^((n-1-p)/2)*(1+(1-r^2)*g)^(-(n-1)/2)*g^(-3/2)*exp(-n/(2*g))};
  bf10=integrate(int, lower=0,upper=Inf,r=r1,p=p1,n=n)$value/
       integrate(int,lower=0,upper=Inf,r=r0,p=p0,n=n)$value;
  return(bf10)
}

谢谢

问题在于,当在其域中使用
x
值调用时,积分函数正在生成
NaN
值。您正在从0积分到无穷大,因此让我们检查有效的
x
值1000:

int2(1000, sqrt(0.245), 530, 3)
# [1] NaN
您的目标是将四个部分相乘:

x <- 1000
r <- sqrt(0.245)
n <- 530
p <- 3
(1+x)^((n-1-p)/2)
# [1] Inf
(1+(1-r^2)*x)^(-(n-1)/2)
# [1] 0
x^(-3/2)
# [1] 3.162278e-05
exp(-n/(2*x))
# [1] 0.7672059

缺少或
NaN
输入值被视为非有限值。我不认为是这样。没有丢失或不存在输入值。没有数据。这是一个简单数学表达式的积分。这不是一个好的方法,Dimitri:数值积分确实使用“数据”,因为它必须在指定的位置计算被积函数的值。
int3 = function(x, r, n, p) {
  loga <- ((n-1-p)/2) * log(1+x)
  logb <- (-(n-1)/2) * log(1+(1-r^2)*x)
  logc <- -3/2 * log(x)
  logd <- -n/(2*x)
  return(ifelse(x == 0, 0, exp(loga + logb + logc + logd)))
}
integrate(f=int3,lower=0,upper=Inf,n=530,r=sqrt(.245),p=3, stop.on.error=FALSE)
# 1.553185e+27 with absolute error < 2.6e+18