Я покажу ще одне можливе рішення, яке досить широко застосовується, а з сучасним програмним забезпеченням R, досить простим у виконанні. Це наближення щільності сідлових точок, яке повинно бути більш відомим!
Для термінології розподілу гами я дотримуюся https://en.wikipedia.org/wiki/Gamma_distribution з параметризацією форми / масштабу, - параметр форми, а - масштаб. Для наближення сідлоподібної точки я дотримуюся Рональда У Батлера: "Наближення сідлових точок з додатками" (Cambridge UP). Наближення сідлових точок пояснюється тут: Як працює наближення сідлових точок?
тут я покажу, як це використовується в цій програмі.θкθ
Нехай - випадкова величина з існуючою функцією, що генерує момент
яка повинна існувати для в деякому відкритому інтервалі, який містить нуль. Тоді визначте функцію генерації накопичувача через
Відомо, що . Рівняння сідлової точки - що неявно визначає як функцію (яка повинна знаходитися в діапазоні ). Запишемо цю неявно визначену функцію як
. Зауважимо, що рівняння сідлових точок завжди має рівно одне рішення, оскільки кумулятивна функція опукла. M ( s ) = E e s X s K ( s ) = log M ( s ) E X =Х
М( s ) = Eеs X
сК( s ) = журналМ( и )
KЕХ= К'( 0 ) , вар ( X) = К′ ′( 0 )и х X сек ( х )К'( с^) = х
схХс^( х )
Тоді перевалу наближення до щільності з задається
Ця приблизна функція густини не гарантується інтегруванням до 1, так само ненормоване наближення сідлових точок. Ми могли б її інтегрувати чисельно і перенормувати, щоб отримати краще наближення. Але це наближення гарантовано є негативним.Х е ( х ) = 1fХ
f^( х ) = 12 πК′ ′( с^)-------√досвід( К( с^) - с^х )
Тепер нехай є незалежними гамма-випадковими змінними, де має розподіл з параметрами . Тоді сукупною функцією генерації є
визначена для . Перша похідна -
а друга похідна -
Далі я наведу деякий код, що обчислює це, і буду використовувати значення параметрів , ,X i ( kХ1, X2, … , XнХi( кi,θi)
К( s ) = - ∑i =1нкiln( 1 - θiз )
s < 1 / max ( θ1, θ2, … , Θн)К'( s ) = ∑i = 1нкiθi1 - θiс
n=3k=(1,2,3)θ=(1,2,3)К′ ′( s ) = ∑i = 1нкiθ2i( 1 - θiз )2.
R
n = 3k = ( 1 , 2 , 3 )θ = ( 1 , 2 , 3 ). Зауважте, що наступний
R
код використовує новий аргумент у функції uniroot, введеній в R 3.1, тому не буде працювати у старих R.
shape <- 1:3 #ki
scale <- 1:3 # thetai
# For this case, we get expectation=14, variance=36
make_cumgenfun <- function(shape, scale) {
# we return list(shape, scale, K, K', K'')
n <- length(shape)
m <- length(scale)
stopifnot( n == m, shape > 0, scale > 0 )
return( list( shape=shape, scale=scale,
Vectorize(function(s) {-sum(shape * log(1-scale * s) ) }),
Vectorize(function(s) {sum((shape*scale)/(1-s*scale))}) ,
Vectorize(function(s) { sum(shape*scale*scale/(1-s*scale)) })) )
}
solve_speq <- function(x, cumgenfun) {
# Returns saddle point!
shape <- cumgenfun[[1]]
scale <- cumgenfun[[2]]
Kd <- cumgenfun[[4]]
uniroot(function(s) Kd(s)-x,lower=-100,
upper = 0.3333,
extendInt = "upX")$root
}
make_fhat <- function(shape, scale) {
cgf1 <- make_cumgenfun(shape, scale)
K <- cgf1[[3]]
Kd <- cgf1[[4]]
Kdd <- cgf1[[5]]
# Function finding fhat for one specific x:
fhat0 <- function(x) {
# Solve saddlepoint equation:
s <- solve_speq(x, cgf1)
# Calculating saddlepoint density value:
(1/sqrt(2*pi*Kdd(s)))*exp(K(s)-s*x)
}
# Returning a vectorized version:
return(Vectorize(fhat0))
} #end make_fhat
fhat <- make_fhat(shape, scale)
plot(fhat, from=0.01, to=40, col="red", main="unnormalized saddlepoint approximation\nto sum of three gamma variables")
в результаті виходить наступний сюжет:
Я залишу нормоване наближення сідлових точок як вправу.