Ich werde eine andere mögliche Lösung aufzeigen, die ziemlich weit verbreitet und mit der heutigen R-Software ziemlich einfach zu implementieren ist. Das ist die Sattelpunktdichte-Näherung, die weiter bekannt sein sollte!
Für die Terminologie zur Gammaverteilung folge ich https://en.wikipedia.org/wiki/Gamma_distribution mit der Form- / Skalierungsparametrierung, ist der Formparameter und ist die Skalierung. Für die Sattelpunktnäherung werde ich Ronald W Butler folgen: "Sattelpunktnäherungen mit Anwendungen" (Cambridge UP). Die Sattelpunktnäherung wird hier erklärt: Wie funktioniert die Sattelpunktnäherung?
hier werde ich zeigen, wie es in dieser Anwendung verwendet wird.θkθ
Sei eine Zufallsvariable mit der existierenden momenterzeugenden Funktion
die für in einem offenen Intervall existieren muss , das Null enthält. Definieren Sie dann die kumulative Erzeugungsfunktion durch
Es ist bekannt, dass . Die Sattelpunktgleichung ist was implizit als eine Funktion von (die im Bereich von ). Wir schreiben diese implizit definierte Funktion als
. Beachten Sie, dass die Sattelpunktgleichung immer genau eine Lösung hat, da die kumulative Funktion konvex ist. M ( s ) = E e s X s K ( s ) = log M ( s ) E X = K ' ( 0 ) , Var ( x ) = K " ( 0 ) K ' ( s ) = x s x x s ( x )X
M(s)=EesX
sK(s)=logM(s)
EX=K′(0),Var(X)=K′′(0)K′(s^)=x
sxXs^(x)
Dann ist die Sattelpunktnäherung an die Dichte von gegeben durch
Es ist nicht garantiert, dass diese ungefähre Dichtefunktion zu 1 integriert wird, ebenso wie die nicht normalisierte Sattelpunktnäherung. Wir könnten es numerisch integrieren und renormieren, um eine bessere Annäherung zu erhalten. Diese Annäherung ist jedoch garantiert nicht negativ.X f ( x ) = 1fX
f^(x)=12πK′′(s^)−−−−−−−√exp(K(s^)−s^x)
Nun seien unabhängige Gamma-Zufallsvariablen, wobei die Verteilung mit Parametern . Dann ist die kumulativ erzeugende Funktion
definiert für . Die erste Ableitung ist
und die zweite Ableitung ist
Im Folgenden werde ich einen Code angeben, der dies berechnet, und die Parameterwerte , ,X1,X2,…,XnXi(ki,θi)
K(s)=−∑i=1nkiln(1−θis)
s<1/max(θ1,θ2,…,θn)K′(s)=∑i=1nkiθi1−θis
n=3k=(1,2,3)θ=K′′(s)=∑i=1nkiθ2i(1−θis)2.
R
n=3k=(1,2,3)θ=(1,2,3). Beachten Sie, dass der folgende
R
Code ein neues Argument in der in R 3.1 eingeführten Uniroot-Funktion verwendet und daher nicht in älteren Rs ausgeführt wird.
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")
Daraus ergibt sich die folgende Handlung:
Ich werde die normalisierte Sattelpunktnäherung als Übung verlassen.