Menemukan cara untuk mensimulasikan angka acak untuk distribusi ini

20

Saya mencoba untuk menulis sebuah program dalam R yang mensimulasikan angka acak semu dari distribusi dengan fungsi distribusi kumulatif:

F(x)=1exp(axbp+1xp+1),x0

di manaa,b>0,p(0,1)

Saya mencoba inverse transform sampling tetapi kebalikannya tampaknya tidak dapat dipecahkan secara analitis. Saya akan senang jika Anda bisa menyarankan solusi untuk masalah ini

Sebastian
sumber
1
Tidak cukup waktu untuk jawaban yang lengkap, tetapi Anda dapat memeriksa algoritme Pengambilan Sampel Penting, sebagai alternatif.
chuse
1
ini bukan latihan buku teks, saya hanya menetapkan batasan karena ini merupakan asumsi yang masuk akal untuk data saya
Sebastian
6
Saya kemudian terkejut dengan normalisasi "ajaib" oleh (p+1)1 yang mengubah distribusi menjadi kekuatan sempurna dari Eksponensial, tetapi keajaiban memang terjadi (dengan kemungkinan kecil).
Xi'an

Jawaban:

49

Ada solusi langsung (dan jika saya dapat menambahkan, anggun) untuk latihan ini: karena muncul seperti produk dari dua distribusi survival: distribusi adalah distribusi Dalam hal ini adalah Exponential dan adalah -th kekuatan distribusi Exponential .1F(x)

(1F(x))=exp{axbp+1xp+1}=exp{ax}1F1(x)exp{bp+1xp+1}1F2(x)
F
X=min{X1,X2}X1F1,X2F2
F1E(a)F21/(p+1)E(b/(p+1))

Kode R terkait sesederhana mungkin

x=pmin(rexp(n,a),rexp(n,b/(p+1))^(1/(p+1))) #simulating an n-sample

dan itu pasti jauh lebih cepat daripada pdf terbalik dan resolusi accept-reject:

> n=1e6
> system.time(results <- Vectorize(simulate,"prob")(runif(n)))
utilisateur     système      écoulé 
    89.060       0.072      89.124 
> system.time(x <- simuF(n,1,2,3))
utilisateur     système      écoulé 
     1.080       0.020       1.103 
> system.time(x <- pmin(rexp(n,a),rexp(n,b/(p+1))^(1/(p+1))))
utilisateur     système      écoulé 
     0.160       0.000       0.163 

dengan kecocokan sempurna yang tidak mengejutkan:

masukkan deskripsi gambar di sini

Xi'an
sumber
5
solusi yang sangat keren!
Sebastian
14

Anda selalu dapat memecahkan transformasi invers secara numerik.

Di bawah, saya melakukan pencarian pembelahan yang sangat sederhana. Untuk probabilitas input yang diberikan (saya menggunakan karena Anda sudah memiliki dalam rumus Anda), saya mulai dengan dan . Lalu saya gandakan hingga . Akhirnya, saya membagi dua interval hingga panjangnya lebih pendek dari dan titik tengahnya memenuhi .qqpxL=0xR=1xRF(xR)>q[xL,xR]ϵxMF(xM)q

ECDF sesuai dengan Anda dengan cukup baik untuk pilihan saya dan , dan itu cukup cepat. Anda mungkin dapat mempercepat ini dengan menggunakan beberapa pengoptimalan tipe Newton alih-alih pencarian pembelahan sederhana.Fab

aa <- 2
bb <- 1
pp <- 0.1

cdf <- function(x) 1-exp(-aa*x-bb*x^(pp+1)/(pp+1))

simulate <- function(prob,epsilon=1e-5) {
    left <- 0
    right <- 1
    while ( cdf(right) < prob ) right <- 2*right

    while ( right-left>epsilon ) {
        middle <- mean(c(left,right))
        value_middle <- cdf(middle)
        if ( value_middle < prob ) left <- middle else right <- middle
    }

    mean(c(left,right))
}

set.seed(1)
results <- Vectorize(simulate,"prob")(runif(10000))
hist(results)

xx <- seq(0,max(results),by=.01)
plot(ecdf(results))
lines(xx,cdf(xx),col="red")

ECDF

S. Kolassa - Reinstate Monica
sumber
10

Ada yang agak berbelit-belit jika resolusi langsung dengan accept-reject. Pertama, diferensiasi sederhana menunjukkan bahwa pdf dari distribusi adalah Kedua, karena kita memiliki batas atas Ketiga, dengan mempertimbangkan suku kedua dalam , ambil perubahan variabel , yaitu, . Kemudian adalah Jacobian dari perubahan variabel. Jika

f(x)=(a+bxp)exp{axbp+1xp+1}
f(x)=aeaxebxp+1/(p+1)1+bxpebxp+1/(p+1)eax1
f(x)g(x)=aeax+bxpebxp+1/(p+1)
gξ=xp+1x=ξ1/(p+1)
dxdξ=1p+1ξ1p+11=1p+1ξpp+1
Xmemiliki kerapatan bentuk mana adalah konstanta normalisasi, maka memiliki kepadatan yang berarti bahwa (i) adalah didistribusikan sebagai variasi Eksponensial dan (ii) konstanta sama dengan satu. Oleh karena itu, akhirnya sama dengan campuran tertimbang yang sama dari distribusi Exponential dan kekuatan -th dari Exponentialκbxpebxp+1/(p+1)κΞ=X1/(p+1)
κbξpp+1ebξ/(p+1)1p+1ξpp+1=κbp+1ebξ/(p+1)
ΞE(b/(p+1))κg(x)E(a)1/(p+1)E(b/(p+1))distribusi, modulo konstanta multiplikasiatif yang hilang dari untuk memperhitungkan bobot: Dan mudah untuk disimulasikan sebagai campuran.2
f(x)g(x)=2(12aeax+12bxpebxp+1/(p+1))
g

R rendering dari algoritma accept-reject dengan demikian

simuF <- function(a,b,p){
  reepeat=TRUE
  while (reepeat){
   if (runif(1)<.5) x=rexp(1,a) else
      x=rexp(1,b/(p+1))^(1/(p+1))
   reepeat=(runif(1)>(a+b*x^p)*exp(-a*x-b*x^(p+1)/(p+1))/
      (a*exp(-a*x)+b*x^p*exp(-b*x^(p+1)/(p+1))))}
  return(x)}

dan untuk sampel-n:

simuF <- function(n,a,b,p){
  sampl=NULL
  while (length(sampl)<n){
   x=u=sample(0:1,n,rep=TRUE)
   x[u==0]=rexp(sum(u==0),b/(p+1))^(1/(p+1))
   x[u==1]=rexp(sum(u==1),a)
   sampl=c(sampl,x[runif(n)<(a+b*x^p)*exp(-a*x-b*x^(p+1)/(p+1))/
      (a*exp(-a*x)+b*x^p*exp(-b*x^(p+1)/(p+1)))])
   }
  return(sampl[1:n])}

Berikut ini adalah ilustrasi untuk a = 1, b = 2, p = 3:

masukkan deskripsi gambar di sini

Xi'an
sumber