在R中集成具有函数作为参数的函数

时间:2015-03-02 21:05:51

标签: r function parameters vectorization

所以我刚刚回答了一个问题,一旦得到回答(我认为正确),提问者就删除了它。所以这又是:


我是R的新手,需要帮助才能使此功能正常工作。我需要创建一个函数,可以找到任何函数的mgf日志,并返回指定t的值。我已经做了很多研究,我发现很多东西告诉我使用Vectorize()并确保我正确地定义我的参数但我似乎仍然无法让它工作。如果有人可以帮助我,我会很高兴!

我需要编写一个返回mgf自然对数的数字向量的函数

# I'm using the expression 2*x as an example
# You can use any integrand as long as it is a function of x 
logmgf <- function(integrand, upper, lower, t) {
  expression <- function(x, t) {
   integrand * exp(x * t)
  }
  integrate <- integrate(expression(x, t), upper, lower)
  logmgf <- log(Vectorize(integrate[1]))
  return(logmgf)
}
logmgf(2 * x, upper = Inf, lower = 0, t = 0)
2小时前问过 熊璐

1 个答案:

答案 0 :(得分:2)

让我们尝试更具统计性或数学意义的东西,例如非规范化的正态分布,即表达式:exp(-x ^ 2)

您正在尝试创建一个新表达式(实际上是一个R&#34;调用&#34;),它将被解析为该表达式乘以exp(x * t)的乘积,因此您需要a)传递函数是一个真正的R语言对象,b)使用不会破坏它的函数来处理它。 quote - 函数将构造一个substitute可以在&#34;语言级别操作的表达式&#34;。不幸的是,function - 函数将评估&#34; body&#34;参数以不符合您的符号意图的方式,因此您需要使用body<-(函数),该函数需要赋值运算符右侧的表达式。我将在一些调试print(.)调用中离开,我曾经在之前的工作中了解我出错的地方:

logmgf <- function(integrand, upper, lower, t) {  
      expr <- substitute( integrand *exp(x*t), list(integrand=integrand) )
print(expr)  
      func <-  function(x ){}  # builds an empty function in x
      body(func)<- expr     # could have also set an environment
      # but in this case using envir=parent.frame() is not appropriate
 print(func)
      integral <- integrate( func, upper=upper, 
            # notice need to name the parameters
                            lower=lower 
            # else they would be positionally matched
            # (and therefore reversed in this case)
                           )$value 
            # the integrate fn returns a loist and the numeric part is in $value
      logmgf <- log(integral)
}
res <- logmgf(quote(exp(-x^2)), upper = Inf, lower = -Inf, t = 0)

> res
[1] 0.5723649

MGF从-Inf集成到Inf(或仅限于具有已定义值的x的受限域的函数)。

我想检查一下我是否会从已知参数中得到正确的答案,所以我为正态分布添加了正确的归一化常量:

 mgf <- function(integrand, upper, lower, t) {  
       expr <- substitute( integrand *exp(x*t), list(integrand=integrand) )
       func <-  function(x ){}; body(func)<- expr
       integral <- integrate( func, upper=upper, lower=lower)$value
 }
 res <- mgf(quote((1/sqrt(2*pi))*exp(-x^2/2)), upper = Inf, lower = -Inf, t = 0)
 res
#[1] 1