Jakob Richter

Faltung der Hypergeometrischen Verteilung

Die Faltung von Wahrscheinlichkeitsdichten ist nichts weiter als die Berechnung der Wahrscheinlichkeitsdichte der Summe von Zufallsvariablen, also z.B. die Dichte von X_1+X_2 oder auch X_1+X_2+X_3. Das heißt, wir interessieren uns im diskreten Fall für die Wahrscheinlichkeit P(X+Y=z). Die Berechnung ist recht einfach, wenn X und Y unabhängig voneinander sind: P(X+Y=z)=\sum_{i=0}^z P(X=i) \cdot P(Y=z-i)

Wie berechnet man jetzt jedoch in R möglichst effektiv die Addition von sehr vielen Zufallsvariablen? Zunächst sollte klar werden, dass man „bottom up“ – wie der Informatiker es sagen würde – vorgehen muss. Also es können in einem Schritt immer nur die Dichte der Summe von zwei Zufallsvariablen berechnet werden, da für die Berechnung der Dichte von drei aufsummierten Zufallsvariablen die Dichte von zwei aufsummierten Zufallsvariablen bereits bekannt sein muss.
Nehmen wir an, wir haben die voneinander unabhängigen Zufallsvariablen X_1, X_2, X_3 und möchten die Dichte von Z = X_1 + X_2 + X_3 berechnen. Zunächst berechnen wir also mit der obigen Formel die Dichte von Y=X_1+X_2: P(Y=z)=\sum_{i=0}^z P(X_1=i) \cdot P(X_2=z-i) und danach natürlich P(X_3+Y=z). Mit noch mehr Dichten würden wir einfach so weiter machen.

Wann macht man so was?

Recht einfaches Beispiel anhand des allseits beliebten Urnenmodells und damit der hypergeometrischen Verteilung. Nehmen wir also eine Urne mit 20 weißen und 10 schwarzen Kugeln und eine zweite Urne mit 15 weißen und 30 schwarzen Kugeln. Berechnen wir nun die Wahrscheinlichkeit dafür, dass wir x weiße Kugeln ziehen, wenn wir aus der ersten Urne 15 und aus der zweiten Urne 20 Kugeln ziehen.

1
2
3
4
5
6
7
8
9
dh1 <- dhyper(0:35,20,10,15) #Berechnet die Wkeit 0,1,...,35 weiße Kugeln zu ziehen, wenn in der Urne 20 weiße und 10 schwarze Kugeln sind und 15 Mal gezogen wird.
#Beachte: Bei dh1[1] steht die Wkeit 0 weiße Kugel zu ziehen.
dh2 <- dhyper(0:35,15,30,20)
summe_dh1_dh2 <- function(x){
  #Die Funktion berechnet die Wkeit x weiße Kugeln zu ziehen, wenn man auß beiden Urnen zieht.
  sum(dh2[1:(x+1)]*dh1[(x+1):1])
}
dichte <- sapply(0:35,summe_dh1_dh2) #Wir berechnen für alle möglichen Anzahlen von 0 bis 35 (Wird durch die Anzahl der insgesammt verfügbaren weißen Kugeln als auch durch die Anzahl der insgesammt gezogenen Kugeln begrenzt. Hier ist beides 35.)
plot(0:35,cumsum(dichte),type="s",ylab=expression(P(X+Y<=z)),xlab="z")

Mit ganz vielen Dichten

Wenn man nun ganz viele gleichverteilte diskrete unabhängige Zufallsvariablen addieren will, nutzen wir aus, dass die Dichte nur einmal berechnet werden muss.

1
2
3
4
5
6
dh <- list()
dh[[1]] <- dhyper(0:(6*12),24,25,6) #Können maximal 6*12 weiße Kugeln in 12 Durchgängen ziehen.
for(i in 2:12){
  dh[[i]] <- sapply(0:(12*6),function(x) sum(dh[[1]][1:(x+1)]*dh[[i-1]][(x+1):1]))
}
plot(0:(6*12),cumsum(dh[[12]]),type="s",ylab=expression(P(sum(X)<=z)),xlab="z")


Wer sich noch mehr für die Mathematik interessiert, dem kann ich diese hilfreiche PDF empfehlen.

Leave a Reply