【问题标题】:passing arguments to a function for double integration in R将参数传递给函数以在 R 中进行双重积分
【发布时间】:2014-07-27 22:00:38
【问题描述】:

我有以下代码

 f1 <- function (v1) {
    v1^(beta1-1)*exp(-(lambda1*v1)^beta1-(lambda0*(vv/LC-v1))^beta1)
    }

f2 <- function (v2) {
    v2^(beta1-1)*exp(-(lambda1*v2)^beta1-(lambda0*(vv/UC-v2))^beta1)
    }

F_r <- function (vv) {
    (1+exp(-(lambda1*vv/LC)^beta1)-exp(-(lambda1*vv/UC)^beta1) 
      -beta1*lambda1^beta1* 
              ( integrate(f1,lower=0,upper=vv/LC)$value+
                integrate(f2,lower=0,upper=vv/UC)$value) )* 
              (b1^a1/gamma(a1))*vv^(a1-1)*exp(-b1*vv)
    }

lambda0<-lambda1<-0.01

beta0<-beta1<-1

LC<-0.2
-UC<-1.2

>a1<-2
>b1<-1

integrate(F_r,lower=0,upper=Inf)$value

由于f1和f2是vv的函数,所以我不知道它应该在F_r里面还是外面。但是,F_r 的值应该介于 0 和 1 之间。如果 f1 和 f2 在 F_r 之外,我有以下消息

 ##Error in f(x, ...) : object 'vv' not found##

【问题讨论】:

  • 您缺少b1a1 的定义。您需要将vv 提供给您的函数f1f2,以便他们能够使用它,方法是将vv 添加到他们的函数签名中并通过integrate 调用传递它。
  • 我分别为 a1 和 b1 赋值,但还是不行
  • 在您对integrate 的两个呼叫中添加“, vv”,例如integrate(f1,lower=0,upper=vv/LC, vv) 并将其添加到 f1f2 的函数签名中,例如f1 &lt;- function (v1, vv)
  • 执行 Josilber 建议时出现以下错误“集成错误(f1,lower = 0,upper = vv/LCL_r,vv):达到最大细分数”
  • 你的新错误与原来的错误完全无关——一个简单的谷歌搜索应该足以让你从这里开始(或者,如果失败,一个新的 R 问题 显示你的研究试图解决问题)。

标签: r function statistics integration


【解决方案1】:

这不起作用,因为正如错误所说,函数f1f2 真的不知道vv 的值。它不存在于他们可以访问的范围内。最简单的解决方法是将vv 作为参数传递给函数。唯一的问题是 R 喜欢一次将向量传递给正在集成的函数,并且每个集成级别可能不会传递相同数量的值,因此 v1v2 的长度可能与vv 如果您直接通过它。因此,为了确保我们一次操作一个值 vv,我们将确保 VectorizeF_r 函数。这是重写代码的一种方法

f1 <- function (v1, vv) {
    v1^(beta1-1)*exp(-(lambda1*v1)^beta1-(lambda0*(vv/LC-v1))^beta1)
}

f2 <- function (v2, vv) {
    v2^(beta1-1)*exp(-(lambda1*v2)^beta1-(lambda0*(vv/UC-v2))^beta1)
}

F_r <- Vectorize(function (vv) {
    (1+exp(-(lambda1*vv/LC)^beta1)-exp(-(lambda1*vv/UC)^beta1) 
      -beta1*lambda1^beta1* 
              ( integrate(f1,vv=vv,lower=0,upper=vv/LC)$value+
                integrate(f2,vv=vv,lower=0,upper=vv/UC)$value) )* 
              (b1^a1/gamma(a1))*vv^(a1-1)*exp(-b1*vv)
})

lambda0<-lambda1<-0.01
beta0<-beta1<-1
LC<-0.2
UC<-1.2
a1<-2
b1<-1

integrate(F_r,lower=0,upper=Inf)$value

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2014-07-27
    相关资源
    最近更新 更多