Проблемы с интеграцией(), возвращающей интеграл 0

У меня возникли проблемы с интегралом, который, насколько я могу судить, должен вести себя хорошо, но неправильно возвращает 0, когда я пытаюсь интегрировать от -Inf до Inf. Рассмотрим следующий код R:

t = 466
N = 50
df = 198
rscale = sqrt(2)/2
delta = seq(50, 80, len=100)
log.const=-13.94309

f = Vectorize(function(delta,t,N,df,rscale,log.const=0)
  exp(dt(t,df,ncp=delta*sqrt(N),log=TRUE) + dcauchy(delta,scale=rscale,log=TRUE) - log.const),
"delta")

integrate(f, -Inf, Inf, t = t, N = N, 
        df = df, rscale = rscale, log.const = log.const)

Этот интеграл возвращает 0. Функция выглядит хорошо, судя по графику:

plot(delta,f(delta,t,N,df,rscale,log.const), ty='l')

и если я интегрирую с «разумным» диапазоном, интеграл будет правильным:

integrate(f, 50, 80, t = t, N = N, 
        df = df, rscale = rscale, log.const = log.const)

И все отлично работает, если вместо этого установить t=465! Почему у integrate() могут быть проблемы с этим интегралом? Кажется, у него проблемы с поиском массы функции, но я не знаю, как указать функции integrate(), где искать. Возможно, есть другой численный подход, который я могу использовать?


person richarddmorey    schedule 04.12.2014    source источник
comment
если вы можете оценить центр масс аналитически, я бы предложил вам сделать замену переменных, чтобы приблизить это значение к 0. integrate() отбирает только (обязательно) конечное число точек, и если вам не повезет, ни одна из них не попадет в не- нулевая часть вашего интеграла. Вы также можете уменьшить допуск (rel.tol), но здесь этого недостаточно.   -  person baptiste    schedule 04.12.2014
comment
см. также stackoverflow.com/q/25585316/471093   -  person baptiste    schedule 04.12.2014
comment
У меня это случилось однажды, и в итоге я использовал простую сетку в разумном диапазоне и сделал это с помощью трапеций. В моем случае точность была не так важна. Также должно быть, что у интеграции были проблемы, даже когда давался разумный диапазон, или, возможно, я просто не подумал об этом. Мне будет интересно посмотреть, что другие предлагают.   -  person Aaron left Stack Overflow    schedule 04.12.2014
comment
Это происходит по причинам, указанным в ссылке baptiste, а также по нескольким другим вопросам. Как только вы выберете -Inf,Inf, количество точек выборки в регионах, где ваша функция имеет приличное значение, может упасть до точки, при которой результат будет плохим. Поскольку вы знаете, что ваша функция практически равна нулю в большей части диапазона, почему бы просто не проинтегрировать некоторые конечные пределы?   -  person Carl Witthoft    schedule 04.12.2014
comment
Вы уверены, что это действительно определено в этом случае? Мне кажется, что вы вычисляете математическое ожидание некоторой функции g(delta) в распределении Коши.   -  person J.R.    schedule 04.12.2014
comment
@ J.R., да, он существует. Это предельная вероятность (которая действительно является ожиданием от Коши, но она существует; это просто нормализующая константа для соответствующего апостериорного значения)   -  person richarddmorey    schedule 04.12.2014
comment
@CarlWitthoft, совет по справке по интеграции говорит об использовании (-Inf, Inf), когда это то, что желательно: при интеграции через бесконечные интервалы делайте это явно, а не просто используя большое число в качестве конечной точки. Это увеличивает вероятность правильного ответа — любая функция, интеграл которой по бесконечному интервалу конечен, должна быть близка к нулю на протяжении большей части этого интервала. (stat.ethz.ch/R-manual /R-devel/library/stats/html/integrate.html)   -  person richarddmorey    schedule 04.12.2014
comment
@baptiste выглядит так, будто сдвиг функции так, чтобы она находилась около 0, делает свое дело!   -  person richarddmorey    schedule 04.12.2014
comment
приятно слышать. Обратите внимание, что вы можете поместить print(delta) в свою функцию, чтобы увидеть, какие точки фактически оцениваются.   -  person baptiste    schedule 05.12.2014