Uygulanması oldukça kolay olan ve bugünün R yazılımıyla mümkün olan başka bir çözümü göstereceğim. Bu, daha geniş bilinmesi gereken saddlepoint yoğunluk yaklaşımıdır!
Gama dağılımı hakkında terminoloji için, ben takip edecek https://en.wikipedia.org/wiki/Gamma_distribution şekil / ölçek parametreleriyle birlikte, şekil parametresi ve θ ölçektir. Saddlepoint yaklaşımı için Ronald W Butler: "Uygulamaları ile saddlepoint yaklaşımları" (Cambridge UP). Saddlepoint yaklaşımı burada açıklanmıştır: Saddlepoint yaklaşımı nasıl çalışır?
Burada bu uygulamada nasıl kullanıldığını göstereceğim.kθ
X
M( s ) = Ees X
sK( s ) = günlükM( s )
K ' ( ler ) = x sEX= K'( 0 ) , Var ( X) = K''( 0 )K'( s^) = x
bu, bir fonksiyonu olarak tanımlar ( aralığında olmalıdır ). Örtük olarak tanımlanmış bu işlevi olarak yazıyoruz
. Saddlepoint denkleminin her zaman tek bir çözüme sahip olduğuna dikkat edin, çünkü kümülant işlevi dışbükeydir.
sx s ( x )xXs^( x )
Sonra yoğunluk için saddlepoint yaklaşım arasında ile verilir
Bu yaklaşık yoğunluk işlevinin 1 değerine entegrasyonu garanti edilmez, normalize edilmemiş saddlepoint yaklaşımıdır. Daha iyi bir yaklaşım elde etmek için onu sayısal olarak bütünleştirebilir ve yeniden düzenleyebiliriz. Ancak bu yaklaşımın negatif olmadığı garanti edilir.ff ( x ) = 1X
f^( x ) = 12 πK''( s^)-------√exp( K( s^) - s^x )
Şimdi 'in bağımsız gama rasgele değişkenleri olmasına izin verin ; burada parametreleri ile sahiptir . Daha sonra kümülatif üretme işlevi
için tanımlanmış . İlk türev
ve ikinci türev
Aşağıda bunu hesaplayan bazı kodlar vereceğim ve , , parametre değerlerini kullanacağımX i ( k i , θ i ) K ( s )X1, X2, … , XnXben( kben, θben)
K( s ) = - ∑i = 1nkbenln( 1 - θbens )
s < 1 / maks ( θ1, θ2, … , Θn) K"(ler)= N Σ i=1kiİçeride ISTV melerin RWMAIWi'nin 2 iK'( s ) = ∑i = 1nkbenθben1 - θbens
n=3k=(1,2,3)θ=(1,2,3)K''( s ) = ∑i = 1nkbenθ2ben( 1 - θbens )2.
R
n = 3k = ( 1 , 2 , 3 )θ = ( 1 , 2 , 3 ). Aşağıdaki
R
kodun, R 3.1'de verilen uniroot işlevinde yeni bir argüman kullandığını unutmayın , bu nedenle eski R'lerde çalışmaz.
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")
aşağıdaki arsada sonuçlanan:
Normalleştirilmiş saddlepoint yaklaşımını bir egzersiz olarak bırakacağım.