При использовании интегрирования для интегрирования логнормальной функции плотности из 2000 -> Inf я возвращаюсь с ошибкой. Раньше я использовал очень похожее уравнение без проблем.
Я попытался отключить остановку при ошибке и установить rel.tol ниже. Я новичок и не знаком с r, поэтому прошу прощения, если никто из них ничего не сделал.
> integrand = function(x) {(x-2000)*(1/x)*(1/(.99066*((2*pi)^.5)))*exp(-((log(x)-7.641)^2)/((2*(.99066)^2)))}
> integrate(integrand,lower=2000,upper=Inf)
1854.002 with absolute error < 0.018
#returns value fine
> integrand = function(x) {(x-2000)*(1/x)*(1/(1.6247*((2*pi)^.5)))*exp(-((log(x)-9.0167)^2)/((2*(1.6247)^2)))}
> integrate(integrand,lower=2000,upper=Inf)
Error in integrate(integrand, lower = 2000, upper = Inf) :
roundoff error is detected in the extrapolation table
#small change in the mu and sigma in the lognormal density function results in roundoff error
> integrate(integrand,lower=1293,upper=Inf)
29005.08 with absolute error < 2
#integrating on lower bound works fine, but having lower=1294 returns a roundoff error again
> integrate(integrand,lower=1294,upper=Inf)
Error in integrate(integrand, lower = 1294, upper = Inf) :
roundoff error is detected in the extrapolation table
Мне должно быть возвращено значение, нет? Я изо всех сил пытаюсь понять, как незначительное изменение значений может привести к тому, что функция больше не будет интегрироваться.
Я нахожу ожидаемое значение с помощью вычитаемых данных, соответствующих логарифмически нормальному распределению. Формула ожидаемого значения берет интеграл от франшизы до бесконечности функции плотности, умноженный на x минус франшиза. Отношение к франшизе как к среднему значению. Подобно центральному моменту, но все мои значения положительные, ненулевые.
Я могу ошибаться, но когда я устанавливаю все вхождения x, вычитаемые на 2000, я получаю то же значение, как если бы франшиза была равна 0. Я пробовал также с 6000 и установкой нижней границы также на 6000 с тем же результатом. Я не очень хорошо разбираюсь в статистике или страховании, но я не думаю, что это ожидаемый результат.
Посмотрите, соответствует ли ответ тому, что вы хотите.
Отлично работает, решил мою проблему. Спасибо.
Прежде всего, я считаю, что вы усложняете определение подынтегральной функции, записывая выражение целиком, лучше использовать встроенную функцию dlnorm
.
g <- function(x, deduce, meanlog, sdlog){
(x - deduce) * dlnorm(x, meanlog = meanlog, sdlog = sdlog)
}
curve(g(x, deduce = 2000, meanlog = 9.0167, sdlog = 1.6247),
from = 1294, to = 1e4)
Что касается проблемы интеграции, пакет cubature
обычно лучше справляется с ошибкой integrate
. Все следующее дает результаты без ошибок.
library(cubature)
cubintegrate(g, lower = 1293, upper = Inf, method = "pcubature",
deduce = 2000, meanlog = 9.0167, sdlog = 1.6247)
cubintegrate(g, lower = 1294, upper = Inf, method = "pcubature",
deduce = 2000, meanlog = 9.0167, sdlog = 1.6247)
cubintegrate(g, lower = 2000, upper = Inf, method = "pcubature",
deduce = 2000, meanlog = 9.0167, sdlog = 1.6247)
Почему первый фактор,
(x - 2000)
?