Использование функции antiD для дисперсии гамма-распределения

Это мой первый пост здесь, и я надеюсь, что буду следовать всем правилам сообщества.

Я пытаюсь рассчитать дисперсию гамма-распределения с параметром формы 2 и параметром масштаба 3 в R, используя функцию antiD из пакета мозаики. Код R, который я использую, следующий

stopifnot(require(mosaic))

f <- function(y) {
     dgamma(y, shape = 2, scale = 3)
}

mean_integral <- antiD( z*f(z) ~ z )
mn <- mean_integral(10^4)

g <- function(y) {
     (y - mn)^2
}

variance <- antiD(f(x)*g(x) ~ x)
variance(10^5)
## [1] 7.115334e-09

Проблема в том, что число, которое я получаю, не имеет смысла, так как дисперсия гамма-распределения с этими параметрами должна быть равна 2*3^2 = 18 (Вики-страница по дистрибутиву Gamma). Более того, если я поставлю 10 ^ 4 в качестве верхней границы (нижняя граница по умолчанию равна 0) для variance(), она вернет следующее:

variance(10^4)
## [1] 18

И интеграл от 10^4 до 10^5 будет:

variance(10^5) - variance(10^4)
## [1] -18

Кто-нибудь знает, почему variance(10^5) в этом случае дает бессмысленные результаты? Так же буду признателен за любые дополнительные комментарии по стилю поста.


person Georgiy Syunyaev    schedule 21.09.2014    source источник
comment
Не знаю ответа, хотя думаю кто-нибудь найдет его в коде для mosaic::numerical.integration. Ваш вопрос ясен и закончен.   -  person IRTFM    schedule 21.09.2014
comment
antiD() — это сложная оболочка (через numerical_integration()) для функции integrate() в базе R. Вы можете увидеть те же результаты гораздо проще с integrate(function(x) dgamma(x,shape=2),lower=0,upper=10^5) (или upper=10^4). Проблема в том, что адаптивное численное интегрирование не работает, если диапазон настолько велик, что начальная сетка не видит никаких нетривиальных значений. Интересно, что upper=Inf на самом деле работает лучше.   -  person Ben Bolker    schedule 21.09.2014
comment
тесно связаны: stackoverflow.com/ вопросы/20665689/   -  person Ben Bolker    schedule 21.09.2014
comment
@BenBolker Большое спасибо, я думаю, что использование (upper = Inf) решает проблему для меня.   -  person Georgiy Syunyaev    schedule 21.09.2014