ตัวอย่างจากการแจกแจงแบบปกติ แต่ไม่ต้องสนใจค่าสุ่มทั้งหมดที่อยู่นอกช่วงที่ระบุก่อนการจำลอง
วิธีนี้ถูกต้อง แต่ตามที่ @ Xi'an กล่าวถึงในคำตอบของเขามันจะใช้เวลานานเมื่อช่วงมีขนาดเล็ก (แม่นยำยิ่งขึ้นเมื่อวัดมีขนาดเล็กภายใต้การกระจายปกติ)
F- 1( ยู) F คือ (ฟังก์ชันสะสมของ) การกระจายดอกเบี้ยและ ยู∼ ยูนิฟ( 0 , 1 ). เมื่อไหร่F คือการแจกแจงที่ได้จากการตัดทอนการแจกแจงบางตัว G ในบางช่วงเวลา ( a , b )นี่เท่ากับตัวอย่าง G- 1( ยู) กับ ยู∼ Unif ( G ( a ) , G ( b ) ).
อย่างไรก็ตามและนี่เป็นที่กล่าวถึงแล้วโดย @ Xi'an ในความคิดเห็นสำหรับบางสถานการณ์วิธีการผกผันต้องมีการประเมินที่แม่นยำมากของฟังก์ชั่นควอไทล์G- 1และฉันจะเพิ่มมันก็ต้องมีการคำนวณอย่างรวดเร็วของG- 1. เมื่อไหร่G เป็นการแจกแจงแบบปกติการประเมินของ G- 1 ค่อนข้างช้าและไม่แม่นยำสำหรับค่าของ a และ ข นอก "ช่วง" ของ G.
จำลองการแจกแจงที่ถูกตัดทอนโดยใช้การสุ่มตัวอย่างที่สำคัญ
ความเป็นไปได้คือการใช้การสุ่มตัวอย่างสำคัญ พิจารณากรณีของการแจกแจงแบบเกาส์มาตรฐานยังไม่มีข้อความ( 0 , 1 ). ลืมสัญลักษณ์ก่อนหน้าตอนนี้ปล่อยG be the Cauchy distribution. The two above mentionned requirements are fulfilled for G : one simply has G(q)=arctan(q)π+12 and G−1(q)=tan(π(q−12)). Therefore, the truncated Cauchy distribution is easy to sample by the inversion method and it is a good choice of the instrumental variable for importance sampling of the truncated normal distribution.
After a bit of simplifications, sampling U∼Unif(G(a),G(b)) and taking G−1(U) is equivalent to take tan(U′) with U′∼Unif(arctan(a),arctan(b)):
a <- 1
b <- 5
nsims <- 10^5
sims <- tan(runif(nsims, atan(a), atan(b)))
Now one has to calculate the weight for each sampled value xi, defined as the ratio ϕ(x)/g(x) of the two densities up to normalization, hence we can take
w(x)=exp(−x2/2)(1+x2),
but it could be safer to take the log-weights:
log_w <- -sims^2/2 + log1p(sims^2)
w <- exp(log_w) # unnormalized weights
w <- w/sum(w)
The weighted sample (xi,w(xi)) allows to estimate the measure of every interval [u,v] under the target distribution, by summing the weights of each sampled value falling inside the interval:
u <- 2; v<- 4
sum(w[sims>u & sims<v])
## [1] 0.1418
This provides an estimate of the target cumulative function.
We can quickly get and plot it with the spatsat
package:
F <- spatstat::ewcdf(sims,w)
# estimated F:
curve(F(x), from=a-0.1, to=b+0.1)
# true F:
curve((pnorm(x)-pnorm(a))/(pnorm(b)-pnorm(a)), add=TRUE, col="red")
# approximate probability of u<x<v:
F(v)-F(u)
## [1] 0.1418
Of course, the sample (xi)ไม่ใช่ตัวอย่างของการกระจายเป้าหมาย แต่เป็นการกระจายเครื่องมือ Cauchy และอีกตัวอย่างหนึ่งได้รับตัวอย่างของการกระจายเป้าหมายโดยดำเนินการresampling ถ่วงน้ำหนักตัวอย่างเช่นการใช้การสุ่มตัวอย่างแบบมัลติโนเมียล:
msample <- rmultinom(1, nsims, w)[,1]
resims <- rep(sims, times=msample)
hist(resims)
mean(resims>u & resims<v)
## [1] 0.1446
วิธีอื่น: การสุ่มตัวอย่างการแปลงผกผันอย่างรวดเร็ว
Olver และ Townsendพัฒนาวิธีการสุ่มตัวอย่างสำหรับการกระจายอย่างต่อเนื่องในระดับกว้าง มันถูกนำมาใช้ในห้องสมุด chebfun2 สำหรับ Matlabเช่นเดียวกับห้องสมุด ApproxFun สำหรับ Juliaจูเลีย ฉันเพิ่งค้นพบห้องสมุดนี้และฟังดูมีแนวโน้มมาก (ไม่เพียง แต่สำหรับการสุ่มตัวอย่าง) โดยทั่วไปนี่เป็นวิธีการผกผัน แต่ใช้การประมาณค่าที่มีประสิทธิภาพของ cdf และ c ผกผัน อินพุตคือฟังก์ชันความหนาแน่นเป้าหมายจนถึงการปรับมาตรฐาน
ตัวอย่างถูกสร้างขึ้นโดยรหัสต่อไปนี้:
using ApproxFun
f = Fun(x -> exp(-x.^2./2), [1,5]);
nsims = 10^5;
x = sample(f,nsims);
เมื่อตรวจสอบด้านล่างแล้วจะให้การวัดช่วงเวลาโดยประมาณ [ 2 , 4 ] ใกล้กับที่ได้รับก่อนหน้านี้โดยการสุ่มตัวอย่างที่สำคัญ:
sum((x.>2) & (x.<4))/nsims
## 0.14191