確率変数の合計の条件付けを含むシミュレーション


8

私はこの質問を読んでい、必要な量のシミュレーションについて考えました。問題は次のとおりですBが標準のiidである場合、E A 2 | A + B )とは何ですか?E A 2 | A + B をシミュレートしたいと思います。(選択した値A + Bの場合ABE(A2|A+B)E(A2|A+B)A+B

これを達成するために次のコードを試しました:

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 )

問題は、ほとんどの場合、(シミュレーション全体で)sum_AB一致する値がないことxです。からいくつかの要素を選択するsum_ABと、それは通常、ベクトル内のその値の唯一のインスタンスになります。

一般的に、この問題に取り組み、正確なシミュレーションを実行して、指定されたフォームの期待値を見つけるにはどうすればよいですか?(Bは必ずしも正規分布であるとは限らず、同じ分布からのものであるとは限りません。)AB


1
コメントの交換が示すように、最近の編集により質問が大幅に変更されます。あなたが今考えているはるかに一般的なもので答えることはより難しくなります。たとえば、値が稀である(片方の尾にある)場合にそれに答えるための特別な(かなり複雑な)テクニックが存在します。A+B
whuber

@whuber 2つの連続確率変数を処理する場合、すべての値が比較的まれではないでしょうか?
Comp_Warrior 2014

1
はい。ただし、値の狭いバンド(通常、このようなシミュレーションでは十分です)が裾(PDFが非常に小さくなる他の領域)では機能しませんが、密度が比較的大きい場合は、簡単に実行できます。が望ましい値に十分に近い適切な数のデータを生成し、シミュレーションからいくつかの結論を導き出すことができる総当たり計算。A+B
whuber

@whuberなるほど。あなたが言及している特別なテクニックについて、答えを教えてください。以下のコメントで私が何に興味があったかを示さなかったことについての謝罪。
Comp_Warrior 2014

Comp_Warrior @whuberがほのめかしていると私が思う2番目のソリューションを追加します。
Dan

回答:


5

参照スレッドでの私のコメントは、1つの効率的なアプローチを提案しています:Y = A Bは共分散がゼロの共同正規であるので、それらは独立していて、シミュレーションはY(平均0と分散2のみ)を生成する必要があるだけです)およびA = X + Y / 2を構築します。この例では、A 2の分布| A + B = 3 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)

期待は次のように見積もることができます

mean(a^2)

答えは近くにする必要があります11/4=2.75


1
ありがとう-これは理にかなっています。ただし、この単純化が機能するのは、問題の両方の確率変数が正常なiidである場合にのみ機能することを理解してよろしいですか?Bが別のディストリビューションから(そして、可能であれば互いに分離して)いる場合はどうなりますか?AB
Comp_Warrior 2014

1
あなたの理解は正しいです。これが、理論的にもコンピュータモデルでも通常の変数が非常に人気がある理由の1つです。それにもかかわらず、変数を独立した(または簡単に関連付けられる)変数のセットに変換する方法を探すという基本的な考え方は、より一般的な設定に引き継がれます。
whuber

2

(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

1

この問題は、ブートストラップサンプルを使用して解決できます。例えば、

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


1
A+BA+B3

@whuberあなたは完全に正しいです。合計が表示されることがわかっている場合にのみ実行できます。
ダン

0

問題はこれになると私には思えます:

  1. X + Y = kの条件付きで(X、Y)をシミュレートする方法
  2. モンテカルロを使用して、いくつかの関数U(x、y)のEU(X、Y)を推定します

重要性のサンプリングを確認することから始めましょう:

EV(Z1)=V(z)f1(z)=V(z)f1(z)f2(z)f2(z)=EV(Z2)f1(Z2)f2(Z2)

Z1f1(z)Z2f2(z)

zif11niV(zi)zif21niV(zi)f1(zi)f2(zi)

今度は、ケースに戻りましょう。U(x,y)=x2(X,Y)f(x,y)x+y=kf(x,y)A=x+y=kf(x,y)

だから今の手順は:

  1. g(x)Xi
  2. Yi=kXig(x)I(x+y=k)I()
  3. 1niU(xi,yi)f(xi,yi)Ag(xi)

1
A=0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.