如何在R

时间:2019-04-25 10:25:14

标签: r function for-loop multiplication probability-density

我想实现贝叶斯学习过程,更具体地说,我想在for循环的每个times迭代中获得一个函数,这意味着在过程结束时我希望获得一个函数。列表中包含数量为times的函数(此数量当然作为函数参数传递)。

因此,在每一步中,我首先需要将两个函数相乘并将其规格化(表示其整数和为1),并将结果函数(后验密度)存储在列表中,该列表将用于下一个乘积迭代。

首先,我以这种方式尝试了基本函数乘法

function(data,times=1) {

  func <- list()
  posterior <- function(x) {1}
  for(i in seq(times)) {
    f0 <- function(x) {1/sqrt(2*pi*2)*exp(-0.25 * (data[i]-x)^2)}
    new_f <- function(x) {f0(x) * posterior(x)}
    normvalue <- integrate(new_f,  lower=-10, upper=10)$value
    fnorm <- function(x) {1/normvalue}
    posterior <- function(x) new_f(x)*normvalue(x)
    func <- c(func,list(posterior))
 }
 return(func)
}

这会产生地狱错误Error: evaluation nested too deeply: infinite recursion / options(expressions=)? Error during wrapup: Error during wrapup: Error during wrapup: Error during wrapup: Error during wrapup: Error during wrapup: Error during wrapup: Error during wrapup:,因此我阅读了Multiplying two functions并尝试了以下操作

function(data,times=1) {

  Multiply=function(a,b){
    force(a)
    force(b)
    function(x){a(x)*b(x)}
  }

  func <- list()
  posterior <- function(x) {1}
  for(i in seq(times)) {
    f0 <- function(x) {1/sqrt(2*pi*2)*exp(-0.25 * (data[i]-x)^2)}
    new_f <- Multiply(f0,posterior)
    normvalue <- integrate(new_f,  lower=-10, upper=10)$value
    fnorm <- function(x) {1/normvalue}
    posterior <- Multiply(new_f,fnorm)
    func <- c(func,list(posterior))
  }

  return(func)
}

现在它不会产生任何错误,但是列表func中的函数会随着变量f0normvalue在下一次迭代中的更改而改变。这样,唯一正确保存的函数将是列表中的最后一个函数,多次调用此函数以获得连续的密度没有任何意义。

我如何使它工作并通过一个函数调用返回所有必需的函数?

0 个答案:

没有答案