この問題は、ブートストラップサンプルを使用して解決できます。例えば、
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)
たとえば、このコードを実行すると、次のようになります
> estimate
[1] 0.7336328
> x
[1] 0.9890429
A+B=0.9890429E(A2|A+B=0.9890429)=0.7336328
これが答えであることを検証するために、彼のソリューションでwhuberのコードを実行してみましょう。したがって、彼のコードを実行すると、x<-0.9890429
結果は次のようになります。
> x <- 0.9890429
> y <- rnorm(1e5, 0, sqrt(2))
> a <- (x+y)/2
> hist(a^2)
>
> mean(a^2)
[1] 0.745045
したがって、2つのソリューションは非常に接近しており、互いに一致しています。ただし、問題への私のアプローチでは、データが正規分布からのものであるという事実に依存するのではなく、実際に任意の分布を入力できるようにする必要があります。
密度が比較的大きい場合にブルートフォース計算を簡単に実行できるという事実に依存する、2番目に強力なソリューションは次のとおりです。
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
このコードを実行すると、次のようになります。
> estimate
[1] 2.757067
A+B=3E(A2|A+B=3)=2.757067