Mostraré otra posible solución, que es bastante aplicable, y con el software R de hoy, bastante fácil de implementar. Esa es la aproximación de la densidad del punto de silla, que debería ser más conocida.
kθ
X
M(s)=EesX
sK(s)=logM(s)
EX=K′(0),Var(X)=K′′(0). La ecuación de punto de silla es que define implícitamente como una función de (que debe estar en el rango de ). Escribimos esta función implícitamente definida como
. Tenga en cuenta que la ecuación saddlepoint siempre tiene exactamente una solución, porque la función acumulativa es convexa.
K′(s^)=x
sxXs^(x)
Entonces, la aproximación del punto de silla de montar a la densidad de viene dada por
No se garantiza que esta función de densidad aproximada se integre a 1, por lo que es la aproximación del punto de silla no normalizada. Podríamos integrarlo numéricamente y renormalizar para obtener una mejor aproximación. Pero se garantiza que esta aproximación no sea negativa.fX
f^(x)=12πK′′(s^)−−−−−−−√exp(K(s^)−s^x)
X i ( k i , θ i ) K ( s ) = - n ∑ i = 1 k i ln ( 1 - θ i s )X1,X2,…,XnXi(ki,θi)
K(s)=−∑i=1nkiln(1−θis)
s<1/max(θ1,θ2,…,θn) K″(s)= n ∑ i=1kiθ 2 iK′(s)=∑i=1nkiθi1−θis
n=3k=(1,2,3)θ=(1,2,3)K′′(s)=∑i=1nkiθ2i(1−θis)2.
R
n=3k=(1,2,3)θ=(1,2,3) . Tenga en cuenta que el siguiente
R
código usa un nuevo argumento en la función uniroot introducida en R 3.1, por lo que no se ejecutará en R's anteriores.
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")
resultando en la siguiente trama:
Dejaré la aproximación normalizada del punto de silla como ejercicio.