Mostraré otra posible solución, que es bastante ampliamente aplicable y, con el software R de hoy en día, bastante fácil de implementar. ¡Esa es la aproximación de la densidad del punto de silla, que debería ser más conocida!
Para la terminología sobre la distribución gamma, seguiré https://en.wikipedia.org/wiki/Gamma_distribution con la parametrización de forma/escala, $k$ es el parámetro de forma y $\theta$ es la escala. Para la aproximación de punto de silla seguiré a Ronald W Butler: "Saddlepoint approximations with applications" (Cambridge UP). La aproximación de punto de silla se explica aquí: ¿Cómo funciona la aproximación de punto de silla? aquí mostraré cómo se usa en esta aplicación.
Sea $X$ una variable aleatoria con función de generación de momentos existente $$ M(s) = E e^{sX} $$ que debe existir para $s$ en algún intervalo abierto que contenga cero. Luego define la función generadora de cumulantes por $$ K(s) = \log M(s) $$ Se sabe que $E X = K'(0), \text{Var} (X) = K''(0)$. La ecuación de punto de silla es $$ K'(\hat{s}) = x$$ que define implícitamente $s$ como una función de $x$ (que debe estar en el rango de $X$). Escribimos esta función definida implícitamente como $\hat{s}(x)$. Notar que la ecuación de punto de silla siempre tiene exactamente una solución, porque la función cumulante es convexa.
Luego, la aproximación de punto de silla a la densidad $f$ de $X$ está dada por $$ \hat{f}(x) = \frac1{\sqrt{2\pi K''(\hat{s})}} \exp(K(\hat{s}) - \hat{s} x) $$ Esta función de densidad aproximada no garantiza integrar a 1, por lo que es la aproximación de punto de silla no normalizada. Podríamos integrar numéricamente y luego normalizar para obtener una mejor aproximación. Pero esta aproximación está garantizada de ser no negativa.
Ahora sean $X_1, X_2, \dots, X_n$ variables aleatorias gamma independientes, donde $X_i$ tiene la distribución con parámetros $(k_i, \theta_i)$. Luego la función generadora de cumulantes es $$ K(s) = -\sum_{i=1}^n k_i \ln(1-\theta_i s) $$ definida para $s<1/\max(\theta_1, \theta_2, \dots, \theta_n)$. La primera derivada es $$ K'(s) = \sum_{i=1}^n \frac{k_i \theta_i}{1-\theta_i s} $$ y la segunda derivada es $$ K''(s) = \sum_{i=1}^n \frac{k_i \theta_i^2}{(1-\theta_i s)^2}. $$ En lo siguiente daré algo de código R
que calcula esto, y usaré los valores de parámetros $n=3$, $k=(1,2,3)$, $\theta=(1,2,3)$. Notar que el siguiente código R
utiliza un nuevo argumento en la función uniroot presentado en R 3.1, por lo que no se ejecutará en versiones anteriores de R.
shape <- 1:3 #ki
scale <- 1:3 # thetai
# Para este caso, obtenemos expectativa=14, varianza=36
make_cumgenfun <- function(shape, scale) {
# retornamos una lista(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) {
# ¡Devuelve punto de silla!
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]]
# Función para encontrar fhat para un x específico:
fhat0 <- function(x) {
# Resolver la ecuación de punto de silla:
s <- solve_speq(x, cgf1)
# Calcular el valor de densidad de punto de silla:
(1/sqrt(2*pi*Kdd(s)))*exp(K(s)-s*x)
}
# Devolver una versión vectorizada:
return(Vectorize(fhat0))
} #end make_fhat
fhat <- make_fhat(shape, scale)
plot(fhat, from=0.01, to=40, col="red",
main="aproximación de punto de silla no normalizada\n
a la suma de tres variables gamma")
resultando en el siguiente gráfico:
Dejaré la aproximación de punto de silla normalizada como ejercicio.
7 votos
Una solución explícita para la suma de dos distribuciones Gamma ha sido publicada en stats.stackexchange.com/a/252192.
3 votos
Un ejemplo especial de esto, donde todas las distribuciones Gamma tienen parámetro de forma 1 (es decir, son exponenciales) se llama la distribución (familia) hipoexponencial. Para el caso de solo dos distribuciones exponenciales, también hay una fórmula explícita dada en stats.stackexchange.com/questions/412849.