Você pode resolver esse problema usando amostras de inicialização. Por exemplo,
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)
Executando este código, por exemplo, obtenho o seguinte
> estimate
[1] 0.7336328
> x
[1] 0.9890429
Portanto, quando então .A+B=0.9890429E(A2|A+B=0.9890429)=0.7336328
Agora, para validar que essa deve ser a resposta, vamos executar o código do whuber em sua solução. Então, executando o código com x<-0.9890429
resultados da seguinte maneira:
> x <- 0.9890429
> y <- rnorm(1e5, 0, sqrt(2))
> a <- (x+y)/2
> hist(a^2)
>
> mean(a^2)
[1] 0.745045
E, portanto, as duas soluções são muito próximas e coincidem uma com a outra. No entanto, minha abordagem para o problema deve permitir que você insira qualquer distribuição que desejar, em vez de confiar no fato de que os dados vieram de distribuições normais.
Uma segunda solução de força bruta, mais baseada no fato de que, quando a densidade é relativamente grande, você pode executar facilmente um cálculo de força bruta, é a seguinte
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
Executando este código, obtemos o seguinte
> estimate
[1] 2.757067
Assim, a execução do código para resulta em que concorda com a verdadeira solução.A+B=3E(A2|A+B=3)=2.757067