Saya akan menunjukkan solusi lain yang mungkin, yang cukup banyak diterapkan, dan dengan perangkat lunak R saat ini, cukup mudah untuk diterapkan. Itu adalah perkiraan kepadatan saddlepoint, yang seharusnya diketahui lebih luas!
Untuk terminologi tentang distribusi gamma, saya akan mengikuti https://en.wikipedia.org/wiki/Gamma_distribution dengan parametrization bentuk / skala, adalah parameter bentuk dan θ adalah skala. Untuk perkiraan saddlepoint saya akan mengikuti Ronald W Butler: "perkiraan Saddlepoint dengan aplikasi" (Cambridge UP). Perkiraan saddlepoint dijelaskan di sini: Bagaimana cara pendekatan saddlepoint bekerja?
di sini saya akan menunjukkan bagaimana ini digunakan dalam aplikasi ini.kθ
Misalkan adalah variabel acak dengan fungsi penghasil momen yang ada
M ( s ) = E e s X yang harus ada untuk s dalam beberapa interval terbuka yang berisi nol. Kemudian tentukan fungsi penghasil kumulant oleh
K ( s ) = log M ( s ).
Diketahui bahwa E X = K ′ ( 0 ) , Var ( X ) = K ″ ( 0 )X
M(s)=EesX
sK(s)=logM(s)
EX=K′(0),Var(X)=K′′(0). Persamaan saddlepoint adalah
yang mendefinisikan secara implisit
s sebagai fungsi dari
x (yang harus dalam kisaran
X ). Kami menulis fungsi ini didefinisikan secara implisit sebagai
s ( x ) . Perhatikan bahwa persamaan saddlepoint selalu memiliki tepat satu solusi, karena fungsi kumulans adalah cembung.
K′(s^)=x
sxXs^(x)
Kemudian saddlepoint pendekatan kepadatan dari X diberikan oleh
f ( x ) = 1fX
fungsi kepadatan perkiraan ini tidak dijamin untuk mengintegrasikan ke 1, sehingga adalah saddlepoint pendekatan unnormalized. Kita bisa mengintegrasikannya secara numerik dan renormalisasi untuk mendapatkan perkiraan yang lebih baik. Tetapi perkiraan ini dijamin tidak negatif.
f^(x)=12πK′′(s^)−−−−−−−√exp(K(s^)−s^x)
Sekarang mari menjadi variabel acak gamma independen, di mana X i memiliki distribusi dengan parameter ( k i , θ i ) . Maka fungsi penghasil kumulans adalah
K ( s ) = - n ∑ i = 1 k i ln ( 1 - θ i s ) yang ditentukan untuk s < 1 / maks (X1,X2,…,XnXi(ki,θi)
K(s)=−∑i=1nkiln(1−θis)
. Derivatif pertama adalah
K ′ ( s ) = n ∑ i = 1 k i θ is<1/max(θ1,θ2,…,θn)
dan turunan kedua adalah
K″(s)= n ∑ i=1kiθ 2 iK′( s ) = ∑i = 1nksayaθsaya1 - θsayas
Berikut ini saya akan memberikan beberapakode menghitung ini, dan akan menggunakan nilai parameter
n=3,
k=(1,2,3),
θ=(1,2,3). Perhatikan bahwakodeberikutmenggunakan argumen baru dalam fungsi uniroot yang diperkenalkan di R 3.1, jadi tidak akan berjalan di R yang lebih lama.
K′ ′( s ) = ∑i = 1nksayaθ2saya( 1 - θsayas )2.
R
n = 3k = ( 1 , 2 , 3 )θ=(1,2,3)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")
menghasilkan plot berikut:
Saya akan meninggalkan pendekatan saddlepoint yang dinormalisasi sebagai latihan.