Je vais montrer une autre solution possible, qui est assez largement applicable, et avec le logiciel actuel R, assez facile à mettre en œuvre. C’est l’approximation de la densité de la pointe de la selle, qui devrait être plus largement connue!
Pour la terminologie relative à la distribution gamma, je suivrai https://en.wikipedia.org/wiki/Gamma_distribution avec la paramétrisation shape / scale, est le paramètre de forme et est scale. Pour l’approximation du point à cheval, je vais suivre Ronald W Butler: "Approximations à l’aide des applications" (Cambridge UP). L’approximation du point de selle est expliquée ici: Comment fonctionne l’approximation du point de selle?
Ici, je vais montrer comment il est utilisé dans cette application.θkθ
Soit une variable aléatoire avec une fonction génératrice de moment existante
qui doit exister pour dans un intervalle ouvert contenant zéro. Puis définissez la fonction génératrice du cumulant par
On sait que . L'équation du point de selle est qui définit implicitement en fonction de (qui doit être compris dans la plage de ). Nous écrivons cette fonction définie implicitement comme
. Notez que l'équation du point d'équilibre a toujours exactement une solution, car la fonction de cumulant est convexe. M ( s ) = E e de X s K ( s ) = log M ( s ) E X = K ' ( 0 ) , Var ( X ) = K " ( 0 ) K ' ( s ) = x s x X de ( la x )X
M( s ) = Ees X
sK( s ) = logM( s )
EX= K′( 0 ) , Var ( X) = K′ ′( 0 )K′( s^) = x
sXXs^( x )
Ensuite, l’approximation du point-selle de la densité de est donnée par
L'intégration de la fonction de densité approximative à 1 n'est pas garantie, pas plus que l'approximation du point de selle non normalisée. Nous pourrions l’intégrer numériquement et le renormaliser pour obtenir une meilleure approximation. Mais cette approximation est garantie non négative.X f ( x ) = 1FX
F^( x ) = 12 πK′ ′( s^)-------√exp( K( s^) - s^x )
Soit maintenant des variables aléatoires gamma indépendantes, où a la distribution avec les paramètres . La fonction génératrice du cumulant est alors
défini pour . La première dérivée est
et la dérivée seconde est
Dans ce qui suit, je donnerai du code le calculant et utiliserai les valeurs de paramètre , ,X1, X2, … , XnXje( kje, θje)
K( S ) = - Σi = 1nkjedans( 1 - θjes )
s < 1 / max ( θ1, θ2, … , Θn)K′( s ) = ∑i = 1nkjeθje1 - θjes
K′ ′( s ) = ∑i = 1nkjeθ2je( 1 - θjes )2.
R
n = 3k = ( 1 , 2 , 3 )θ = ( 1 , 2 , 3 ). Notez que le
R
code suivant utilise un nouvel argument dans la fonction uniroot introduite dans R 3.1 et ne s'exécutera donc pas dans les anciens 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")
résultant en l'intrigue suivante:
Je laisserai l'approximation du point de selle normalisée comme un exercice.