Simulasi melibatkan pengkondisian pada jumlah variabel acak

8

Saya membaca pertanyaan ini , dan berpikir untuk mensimulasikan jumlah yang diperlukan. Masalahnya adalah sebagai berikut: JikaA dan B apakah standar normal, apa E(A2|A+B)? Jadi saya ingin mensimulasikanE(A2|A+B). (untuk nilai yang dipilih dariA+B)

Saya mencoba kode berikut untuk mencapai ini:

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 )

Masalahnya adalah bahwa hampir selalu tidak ada nilai sum_AByang cocok x(di seluruh simulasi). Jika saya memilih beberapa elemen sum_AB, maka biasanya satu-satunya contoh nilainya dalam vektor.

Secara umum, bagaimana seseorang dapat mengatasi masalah ini dan melakukan simulasi yang akurat untuk menemukan harapan dari formulir yang diberikan? (A dan B mungkin belum tentu terdistribusi normal, atau dari distribusi yang sama.)

Comp_Warrior
sumber
1
Suntingan terakhir Anda secara substansial mengubah pertanyaan, seperti yang ditunjukkan oleh pertukaran komentar kami. Menjadi lebih sulit untuk menjawab dalam generalisasi yang jauh lebih besar yang sekarang Anda kira. Misalnya, ada teknik khusus - dan agak terlibat - hanya untuk menjawabnya ketika nilaiA+Bjarang (keluar di salah satu ekor).
whuber
@whuber Bukankah semua nilai relatif jarang terjadi ketika kita berhadapan dengan dua variabel acak kontinu?
Comp_Warrior
1
Ya, tetapi kumpulan nilai yang sempit - yang biasanya cukup untuk simulasi seperti itu - tidak akan pernah berhasil di ekor (atau di wilayah lain di mana PDF menjadi sangat kecil), sedangkan ketika kepadatan relatif besar Anda dapat dengan mudah melakukan perhitungan brute-force yang dijamin menghasilkan jumlah data yang layakA+Bcukup dekat dengan nilai yang diinginkan untuk memungkinkan beberapa kesimpulan diambil dari simulasi.
whuber
@whuber saya mengerti - bisakah Anda memberikan beberapa indikasi dalam jawaban Anda tentang teknik khusus yang Anda sebutkan? Permintaan maaf karena tidak menunjukkan apa yang saya minati di bawah ini dalam komentar.
Comp_Warrior
Comp_Warrior Saya menambahkan solusi kedua yang saya percaya adalah apa yang disinggung oleh @whuber.
Dan

Jawaban:

5

Komentar saya di utas yang dirujuk menyarankan satu pendekatan yang efisien: karena X=A+B dan Y=AB Secara bersama-sama Normal dengan nol kovarian, independen, dari mana simulasi hanya perlu dihasilkan Y (yang artinya 0 dan varians 2) dan membangun A=(X+Y)/2. Dalam contoh ini distribusiA2|(A+B=3) diperiksa dengan menggunakan histogram 105 nilai simulasi.

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

Harapan tersebut dapat diperkirakan sebagai

mean(a^2)

Jawabannya harus dekat 11/4=2.75.

whuber
sumber
1
Terima kasih - ini masuk akal. Namun, apakah saya benar dalam memahami bahwa penyederhanaan ini hanya akan berfungsi jika kedua variabel acak tersebut benar-benar normal? Bagaimana jika saya punya kasus di manaA dan Bberasal dari distribusi lain (dan mungkin terpisah satu sama lain)?
Comp_Warrior
1
Pemahaman Anda benar. Ini adalah salah satu alasan Variabel normal sangat populer, baik secara teoritis maupun dalam model komputer! Namun demikian, ide dasar mencari cara untuk mengubah variabel menjadi set variabel independen (atau mudah terkait) akan dibawa ke pengaturan yang lebih umum.
whuber
2

Cara umum untuk mengatasi masalah ini adalah dengan mempertimbangkan perubahan variabel dari (A,B) untuk (A,A+B=S). Jacobian dari transformasi ini sama dengan satu (1), kepadatan(A,S) adalah

fA,S(a,s)=fA(a)fB(sa)
Oleh karena itu kepadatan A tergantung pada S=s adalah
fA|S(a|s)fA(a)fB(sa)
dengan istilah proporsionalitas sebagai kebalikan dari kepadatan marginal dari S, fS(s)1. SejakB=SA, transformasi deterministik, ini juga merupakan densitas gabungan (A,B) diberikan S
fA,B|S(a,b|s)fA(a)fB(sa)Ia+b=s
Menghasilkan realisasi dari target ini dapat dilakukan secara langsung jika bentuknya cukup sederhana, atau dengan accept-reject, Metropolis-Hastings, slice sampling, atau metode simulasi standar lainnya.
Xi'an
sumber
1

Anda bisa mengatasi masalah ini menggunakan sampel bootstrap. Sebagai contoh,

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)

Menjalankan kode ini misalnya, saya mendapatkan yang berikut ini

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

Jadi ketika A+B=0.9890429 kemudian E(A2|A+B=0.9890429)=0.7336328.

Sekarang untuk memvalidasi bahwa ini seharusnya jawabannya, mari kita jalankan kode whuber dalam solusinya. Jadi menjalankan kodenya dengan x<-0.9890429hasil sebagai berikut:

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

Dan kedua solusi itu sangat dekat dan bertepatan satu sama lain. Namun, pendekatan saya terhadap masalah seharusnya memungkinkan Anda untuk memasukkan distribusi yang Anda inginkan daripada mengandalkan fakta bahwa data tersebut berasal dari distribusi Normal.


Solusi brute force kedua yang bergantung pada kenyataan bahwa ketika kepadatan relatif besar Anda dapat dengan mudah melakukan perhitungan brute-force adalah sebagai berikut

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

Menjalankan kode ini, kami memperoleh yang berikut ini

> estimate
[1] 2.757067

Dengan demikian menjalankan kode untuk A+B=3 hasil dalam E(A2|A+B=3)=2.757067 yang setuju dengan solusi yang sebenarnya.

Dan
sumber
1
Saya harus melewatkan sesuatu: pertanyaannya meminta pengguna untuk menentukan nilaiA+B. Di mana itu dilakukan dalam kode Anda? Seperti apa kode Anda dalam kasus iniA+B perlu diatur ke 3, contohnya?
Whuber
@whuber kamu sepenuhnya benar. Saya hanya bisa melakukannya untuk jumlah yang saya tahu akan muncul.
Dan
0

menurut saya pertanyaannya adalah:

  1. bagaimana mensimulasikan (X, Y) bersyarat pada X + Y = k dan kemudian
  2. gunakan monte carlo untuk memperkirakan EU (X, Y) untuk beberapa fungsi U (x, y)

mari kita mulai dengan meninjau sampel penting :

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

di mana harapan pertama adalah sehubungan dengan variabel acak Z1 dengan kepadatan f1(z) dan yang kedua adalah wrt Z2 dengan kepadatan f2(z).

Jadi jika Anda dapat mensimulasikan secara acak zidari f1 lalu perkirakan menggunakan 1niV(zi) atau sebagai alternatif mensimulasikan zidari f2 lalu gunakan 1niV(zi)f1(zi)f2(zi)

Sekarang mari kita kembali ke kasus kita U(x,y)=x2 dan (X,Y) didistribusikan sebagai kondisi (X, Y) pada X + Y = k, yaitu f(x,y)x+y=kf(x,y) dan biarkan A=x+y=kf(x,y)

jadi sekarang prosedurnya adalah:

  1. menghasilkan salinan dari kepadatan g(x) - dan hubungi mereka Xi
  2. membiarkan Yi=kXi perhatikan distribusi ini (X, Y) adalah g(x)I(x+y=k)dimana I() adalah fungsi indikator
  3. perkiraannya adalah
    1niU(xi,yi)f(xi,yi)Ag(xi)
pes
sumber
1
Solusi Anda tidak benar sejak itu A=0.
Xi'an