Simulation mit Konditionierung auf Summe von Zufallsvariablen


8

Ich las diese Frage und dachte darüber nach, die erforderliche Menge zu simulieren. Das Problem ist wie folgt: Wenn und Standardnormal sind, was ist ? Also möchte ich simulieren . (für einen gewählten Wert von A + B )EINB.E.(EIN2|EIN+B.)E.(EIN2|EIN+B.)EIN+B.

Ich habe den folgenden Code versucht, um dies zu erreichen:

n <- 1000000
x <- 1 # the sum of A and B

A <- rnorm(n)
B <- rnorm(n)

sum_AB = A+B

estimate <- 1/sum(sum_AB==x) * sum( (A[sum_AB==x])^2 )

Das Problem ist, dass es fast immer keinen Wert gibt, in sum_ABdem Übereinstimmungen x(über Simulationen hinweg) vorliegen. Wenn ich ein Element aus auswähle sum_AB, ist es normalerweise die einzige Instanz seines Werts im Vektor.

Wie kann man dieses Problem im Allgemeinen angehen und eine genaue Simulation durchführen, um eine Erwartung der gegebenen Form zu finden? ( EIN und B. nicht unbedingt normal oder aus derselben Verteilung stammen.)


1
Ihre letzte Änderung ändert die Frage erheblich , wie unser Austausch von Kommentaren zeigt. Es wird schwieriger, in der viel größeren Allgemeinheit zu antworten, die Sie jetzt annehmen. Zum Beispiel gibt es spezielle - und ziemlich komplizierte - Techniken, um sie zu beantworten, wenn der Wert von selten ist (in einem der Schwänze). A+B.
whuber

@whuber Wären nicht alle Werte relativ selten, wenn es sich um zwei kontinuierliche Zufallsvariablen handelt?
Comp_Warrior

1
Ja, aber schmale Wertebänder - die normalerweise für solche Simulationen ausreichen - würden niemals in den Schwänzen (oder in einem anderen Bereich, in dem das PDF sehr klein wird) funktionieren, wohingegen Sie bei relativ großer Dichte leicht eine durchführen können Brute-Force-Berechnung, die sicherstellt, dass eine anständige Anzahl von Daten mit nahe genug an ihrem gewünschten Wert erzeugt wird, um einige Schlussfolgerungen aus der Simulation ziehen zu können. A+B.
whuber

@whuber Ich verstehe - könnten Sie in Ihrer Antwort einen Hinweis auf die speziellen Techniken geben, die Sie erwähnen? Entschuldigung, dass ich in den Kommentaren nicht angegeben habe, woran ich interessiert war.
Comp_Warrior

Comp_Warrior Ich füge eine zweite Lösung hinzu, auf die @whuber meiner Meinung nach anspielt.
Dan

Antworten:


5

Mein Kommentar im Thread, auf den verwiesen wird, schlägt einen effizienten Ansatz vor: Da und gemeinsam Normal mit einer Kovarianz von Null sind, sind sie unabhängig, von wo aus die Simulation nur (mit Mittelwert und Varianz ) und erzeugen muss Konstrukt . In diesem Beispiel wird die Verteilung von anhand des Histogramms von simulierten Werten untersucht.Y = A - B Y 0 2 A = ( X + Y ) / 2 A 2 | ( A + B = 3 ) 10 5X.=EIN+B.Y.=EIN- -B.Y.02EIN=(X.+Y.)/.2EIN2|(EIN+B.=3)105

x <- 3
y <- rnorm(1e5, 0, sqrt(2))
a <- (x+y)/2
hist(a^2)

Die Erwartung kann geschätzt werden als

mean(a^2)

Die Antwort sollte nahe .11/.4=2,75


1
Danke - das macht Sinn. Habe ich jedoch Recht, wenn ich verstehe, dass diese Vereinfachung nur funktioniert, wenn beide fraglichen Zufallsvariablen normal sind? Was wäre, wenn ich einen Fall hätte, in dem und von einer anderen Distribution stammen (und möglicherweise voneinander getrennt sind)? B.EINB.
Comp_Warrior

1
Du hast das richtig verstanden. Dies ist einer der Gründe, warum normale Variablen sowohl theoretisch als auch in Computermodellen so beliebt sind! Die Grundidee, nach einer Möglichkeit zu suchen, die Variablen in Sätze unabhängiger (oder leicht verwandter) Variablen umzuwandeln, wird jedoch auf eine allgemeinere Einstellung übertragen.
whuber

2

Eine generische Möglichkeit, dieses Problem zu lösen, besteht darin, die Änderung der Variablen von nach zu berücksichtigen . Gleich eins (1), die Dichte des Jacobi dieser Transformation ist Daher ist die Dichte von der Bedingung ist wobei der Proportionalitätsterm die Umkehrung der Randdichte von , . Da , eine deterministische Transformation, ist dies auch die Gelenkdichte von bei( A , A + B = S ) ( A , S ) f A , S ( a , s ) = f A ( a ) f B ( s - a ) A S = s f A | S ( a | s ) f A ( a ) f(EIN,B.)(EIN,EIN+B.=S.)(EIN,S.)

fEIN,S.(ein,s)=fEIN(ein)fB.(s- -ein)
EINS.=sS f S ( s ) - 1 B = S - A ( A , B ) S f A , B | S ( a , b | s ) f A ( a ) f B ( s - a ) I a + b = s
fEIN|S.(ein|s)fEIN(ein)fB.(s- -ein)
S.fS.(s)- -1B.=S.- -EIN(EIN,B.)S.
fEIN,B.|S.(ein,b|s)fEIN(ein)fB.(s- -ein)ichein+b=s
Das Generieren einer Realisierung aus diesem Ziel kann direkt erfolgen, wenn die Form einfach genug ist, oder durch Akzeptieren-Zurückweisen, Metropolis-Hastings, Slice-Sampling oder eine andere Standardsimulationsmethode.

1

Sie können dieses Problem mithilfe von Bootstrap-Beispielen lösen. Zum Beispiel,

n <- 1000000

A <- rnorm(n)
B <- rnorm(n)
AB <- cbind(A,B)

boots <- 100
bootstrap_data <- matrix(NA,nrow=boots*n,ncol=2)


for(i in 1:boots){
    index <- sample(1:n,n,replace=TRUE)
    bootstrap_data[(i*n-n+1):(i*n),] <- cbind(A[index],B[index]) 
}

sum_AB <- bootstrap_data[,1] + bootstrap_data[,2]
x <- sum_AB[sample(1:n,1)]

idx <- which(sum_AB == x)

estimate <- mean(bootstrap_data[idx,1]^2)

Wenn ich diesen Code zum Beispiel ausführe, erhalte ich Folgendes

> estimate
[1] 0.7336328
> x
[1] 0.9890429

Wenn also dann ist .EIN+B.=0,9890429E.(EIN2|EIN+B.=0,9890429)=0,7336328

Um zu bestätigen, dass dies die Antwort sein sollte, lassen Sie uns den Code von whuber in seiner Lösung ausführen. Das Ausführen seines Codes x<-0.9890429führt also zu folgenden Ergebnissen:

> x <- 0.9890429
> y <- rnorm(1e5, 0, sqrt(2))
> a <- (x+y)/2
> hist(a^2)
>
> mean(a^2)
[1] 0.745045

Die beiden Lösungen liegen also sehr nahe beieinander und stimmen überein. Meine Herangehensweise an das Problem sollte es Ihnen jedoch tatsächlich ermöglichen, eine beliebige Verteilung einzugeben, anstatt sich auf die Tatsache zu verlassen, dass die Daten aus Normalverteilungen stammen.


Eine zweite Brute-Force-Lösung, die auf der Tatsache beruht, dass Sie bei einer relativ großen Dichte problemlos eine Brute-Force-Berechnung durchführen können, ist die folgende

n <- 1000000

x <- 3  #The desired sum to condition on

A <- rnorm(n)
B <- rnorm(n)
sum_AB <- A+B

epsilon <- .01
idx <- which(sum_AB > x-epsilon & sum_AB < x+epsilon)
estimate <- mean(A[idx]^2)

estimate

Wenn wir diesen Code ausführen, erhalten wir Folgendes

> estimate
[1] 2.757067

Das Ausführen des Codes für führt also zu was mit der wahren Lösung übereinstimmt.EIN+B.=3E.(EIN2|EIN+B.=3)=2,757067


1
Mir muss etwas fehlen: In der Frage wird der Benutzer aufgefordert , den Wert von anzugeben . Wo steht das in deinem Code? Wie würde Ihr Code aussehen, wenn beispielsweise auf gesetzt werden müsste ? EIN+B.EIN+B.3
whuber

@whuber du bist völlig richtig. Ich kann es nur für Beträge tun, von denen ich weiß, dass sie erscheinen werden.
Dan

0

es scheint mir, dass die Frage folgende wird:

  1. wie man (X, Y) abhängig von X + Y = k simuliert und dann
  2. Verwenden Sie Monte Carlo, um EU (X, Y) für eine Funktion U (x, y) zu schätzen.

Beginnen wir mit der Überprüfung der Wichtigkeitsstichprobe :

E.V.(Z.1)=V.(z)f1(z)=V.(z)f1(z)f2(z)f2(z)=E.V.(Z.2)f1(Z.2)f2(Z.2)

Z.1f1(z)Z.2f2(z)

zichf11nichV.(zich)zichf21nichV.(zich)f1(zich)f2(zich)

U.(x,y)=x2(X.,Y.)f(x,y)x+y=kf(x,y)EIN=x+y=kf(x,y)

So ist nun die Prozedur:

  1. G(x)X.ich
  2. Y.ich=k- -X.ichG(x)ich(x+y=k)ich()
  3. 1nichU.(xich,yich)f(xich,yich)EING(xich)

1
EIN=0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.