Как убедиться, что функция R Integrate пропускает значение, где функция не определена? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть функция f, которая определяется с помощью функции g. Я пытаюсь вычислить его энтропию h_f. Я получаю ошибку the integral is probably divergent. Мой код R выглядит следующим образом:

phi <- function(x, m, s) (1/sqrt(2*pi*s^{2}))*exp((-1/2*s^{2})*(x-m)^{2})
g <- function(x, p) p*phi(x, -1, 0.2)+(1-p)*phi(x, -0.5, 1) 
f <- function(x, p) (1/x^{2})*g(log(x),p)
f1 <- function(x,p) (f(x,p)*(log(g(log(x),p))-2*log(x))) ##This is basically f(x)*log(f(x)) 

h_f <- function(p) -(integrate(f1, lower=0, upper=Inf, p=p)$value)
h_f <- Vectorize(h_f)

p <- seq(0,1, 0.01)
h_f(p)

Вещи, которые я пробовал : Я попытался установить res.tol на другое число, которое изменило ошибку на number of subdivisions has exceeded. Затем я понял, что вся ошибка сохраняется, возможно, потому что определение f зависит от деления на x^{2}, я попытался заменить нижний предел x на 1e-5, который работает хорошо и дает мне конечные значения для p в [0,1]. Однако я пытаюсь выяснить, как заставить функцию интегрирования выдавать NA, если x==0. Я пробовал разные версии:

 h_f <- function(p){
              if(x==0) NA
              else{
                  -(integrate(f1, lower=0, upper=Inf, p=p)$value)
                   }
                  }

Но, конечно, это не работает, потому что x не найден в рамках h_f. Я пробовал разные обходные пути, но я не понимаю, как это правильно. Возможно, мне не хватает чего-то очевидного, буду благодарен за любую помощь.

...