Как манипулировать и хранить функции в R - PullRequest
1 голос
/ 25 апреля 2019

Я хочу реализовать байесовскую процедуру обучения, а более конкретно, я хочу получить одну функцию на каждой из times итераций цикла for, что означает, что в конце процедуры я хочу получить список с число 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:, поэтому я прочитал Умножая две функции и попробовал следующее

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 меняются по мере изменения переменных f0 и normvalue в следующих итерациях. Таким образом, единственно правильно сохраненная функция будет последней в списке, и нет смысла вызывать эту функцию несколько раз для получения последовательных значений плотности.

Как мне заставить это работать и вернуть все необходимые функции всего за один вызов функции?

...