Simulation impliquant un conditionnement sur la somme de variables aléatoires

8

Je lisais cette question et j'ai pensé à simuler la quantité requise. Le problème est le suivant: si et sont normaux normaux, qu'est-ce que E (A ^ 2 | A + B) ? Je veux donc simuler E (A ^ 2 | A + B) . (pour une valeur choisie de A + B )ABE(A2|A+B)E(A2|A+B)A+B

J'ai essayé le code suivant pour y parvenir:

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 )

Le problème est qu'il n'y a presque toujours aucune valeur dans sum_ABlaquelle les correspondances x(entre les simulations). Si je choisis un élément sum_AB, c'est généralement la seule instance de sa valeur dans le vecteur.

En général, comment peut-on s'attaquer à ce problème et effectuer une simulation précise pour trouver une attente de la forme donnée? ( A et B ne sont pas nécessairement distribués normalement ou issus de la même distribution.)

Comp_Warrior
la source
1
Votre modification récente modifie considérablement la question, comme l'indique notre échange de commentaires. Il devient plus difficile de répondre dans la généralité beaucoup plus grande que vous supposez maintenant. Par exemple, il existe des techniques spéciales - et plutôt impliquées - juste pour y répondre lorsque la valeur de est rare (dans l'une des queues). A+B
whuber
@whuber Toutes les valeurs ne seraient-elles pas relativement rares lorsque nous avons affaire à deux variables aléatoires continues?
Comp_Warrior du
1
Oui, mais des bandes de valeurs étroites - qui suffisent généralement pour de telles simulations - ne fonctionneraient jamais dans les queues (ni dans aucune autre région où le PDF devient très petit), tandis que lorsque la densité est relativement grande, vous pouvez facilement effectuer une calcul de force brute qui est assuré de produire un nombre décent de données ayant assez proche de sa valeur souhaitée pour permettre de tirer quelques conclusions de la simulation. A+B
whuber
@whuber je vois - pourriez-vous donner une indication dans votre réponse des techniques spéciales que vous mentionnez? Toutes mes excuses pour ne pas avoir indiqué ce qui m'intéressait ci-dessous dans les commentaires.
Comp_Warrior
Comp_Warrior J'ajoute une deuxième solution à laquelle je pense que @whuber fait allusion.
Dan

Réponses:

5

Mon commentaire dans le fil référencé suggère une approche efficace: parce que et sont conjointement normaux avec une covariance nulle, ils sont indépendants, d'où la simulation n'a besoin que de générer (qui a une moyenne de et une variance ) et construire . Dans cet exemple, la distribution de est examinée au moyen de l'histogramme de valeurs simulées.X=A+BY=ABY02A=(X+Y)/2A2|(A+B=3)105

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

L'attente peut être estimée comme

mean(a^2)

La réponse devrait être proche de .11/4=2.75

whuber
la source
1
Merci - cela a du sens. Cependant, ai-je raison de comprendre que cette simplification ne fonctionnera que si les deux variables aléatoires en question sont normales? Et si j'avais un cas où et provenaient d'une autre distribution (et éventuellement séparés l'un de l'autre)? AB
Comp_Warrior
1
Votre compréhension est correcte. C'est une des raisons pour lesquelles les variables normales sont si populaires, à la fois théoriquement et dans les modèles informatiques! Néanmoins, l'idée de base de rechercher un moyen de transformer les variables en ensembles de variables indépendantes (ou facilement liées) se poursuivra dans un cadre plus général.
whuber
2

Une façon générique de résoudre ce problème consiste à considérer le changement de variables de à . Le jacobien de cette transformée étant égal à un (1), la densité de est Donc la densité de conditionnelle à est avec le terme de proportionnalité étant l'inverse de la densité marginale de , . Puisque , une transformée déterministe, c'est aussi la densité conjointe de donnée(A,B)(A,A+B=S)(A,S)

fA,S(a,s)=fA(a)fB(sa)
AS=s
fA|S(a|s)fA(a)fB(sa)
SfS(s)1B=SA(A,B)S
fA,B|S(a,b|s)fA(a)fB(sa)Ia+b=s
La génération d'une réalisation à partir de cette cible peut être effectuée directement si la forme est assez simple, ou par acceptation-rejet, Metropolis-Hastings, échantillonnage par tranche ou toute autre méthode de simulation standard.
Xi'an
la source
1

Vous pouvez résoudre ce problème en utilisant des exemples d'amorçage. Par exemple,

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)

En exécutant ce code par exemple, j'obtiens ce qui suit

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

Ainsi, lorsque alors .A+B=0.9890429E(A2|A+B=0.9890429)=0.7336328

Maintenant pour valider que cela devrait être la réponse, exécutons le code de whuber dans sa solution. Donc, exécuter son code avec les x<-0.9890429résultats suivants:

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

Et donc les deux solutions sont très proches et coïncident l'une avec l'autre. Cependant, mon approche du problème devrait en fait vous permettre de saisir n'importe quelle distribution que vous souhaitez plutôt que de vous fier au fait que les données proviennent de distributions normales.


Une deuxième solution plus brutale qui repose sur le fait que lorsque la densité est relativement grande, vous pouvez facilement effectuer un calcul de force brute est la suivante

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

En exécutant ce code, nous obtenons ce qui suit

> estimate
[1] 2.757067

Ainsi, l'exécution du code pour donne ce qui correspond à la vraie solution.A+B=3E(A2|A+B=3)=2.757067

Dan
la source
1
Je dois manquer quelque chose: la question demande à l'utilisateur de spécifier la valeur de . Où cela se fait-il dans votre code? À quoi ressemblerait votre code dans le cas où devait être défini sur , par exemple? A+BA+B3
whuber
@whuber vous avez complètement raison. Je ne peux le faire que pour des sommes dont je sais qu'elles apparaîtront.
Dan
0

il me semble que la question devient celle-ci:

  1. comment simuler (X, Y) conditionnellement à X + Y = k puis
  2. utiliser monte carlo pour estimer EU (X, Y) pour une fonction U (x, y)

Commençons par examiner l' échantillonnage d'importance :

EV(Z1)=V(z)F1(z)=V(z)F1(z)F2(z)F2(z)=EV(Z2)F1(Z2)F2(Z2)

où la première attente est relative à la variable aléatoire de densité et la seconde est par rapport à de densité .Z1F1(z)Z2F2(z)

Ainsi, si vous pouvez simuler aléatoirement les partir de puis estimer en utilisant ou alternativement simuler les partir de puis en utilisantzjeF11njeV(zje)zjeF21njeV(zje)F1(zje)F2(zje)

Revenons maintenant à notre cas et sont distribués en tant que condition (X, Y) sur X + Y = k, c'est-à-dire et laissezU(X,y)=X2(X,Oui)F(X,y)X+y=kF(X,y)UNE=X+y=kF(X,y)

alors maintenant la procédure est:

  1. générer n copies iid à partir de la densité - et les appelerg(X)Xje
  2. soit noter la distribution de ceci (X, Y) est , où est la fonction indicatriceOuije=k-Xjeg(X)je(X+y=k)je()
  3. l'estimation est
    1njeU(Xje,yje)F(Xje,yje)UNEg(Xje)
pes
la source
1
Votre solution n'est pas correcte car . UNE=0
Xi'an