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 .UNE + B = 0,9890429E(UNE2| 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.9890429
ré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(UNE2| A+B=3)=2,757067