Sayangnya, standar normal (dari mana semua yang lain dapat ditentukan, karena normal adalah keluarga skala lokasi) fungsi kuantil tidak mengakui bentuk tertutup (yaitu 'rumus cantik'). Hal terdekat dengan bentuk tertutup adalah bahwa fungsi kuantil normal standar adalah fungsi, , yang memenuhi persamaan diferensialw
d2wdhal2= w ( dwdhal)2
dan kondisi awal dan . Di sebagian besar lingkungan komputasi ada fungsi yang secara numerik menghitung fungsi kuantil normal. Di R, Anda akan mengetikw ( 1 / 2 ) = 0w′(1/2)=2π−−√
qnorm(p, mean=mu, sd=sigma)
untuk mendapatkan kuantil dari distribusi .pN(μ,σ2)
Sunting: Dengan pemahaman yang dimodifikasi tentang masalah, data dihasilkan dari campuran normals, sehingga kepadatan data yang diamati adalah:
p(x)=∑iwipi(x)
di mana dan setiap adalah kepadatan normal dengan rata-rata dan standar deviasi . Oleh karena itu CDF dari data yang diamati adalah∑iwi=1pi(x)μiσi
F(y)=∫y−∞∑iwipi(x)dx=∑iwi∫y−∞pi(x)=∑iwiFi(y)
di mana adalah CDF normal dengan mean dan standar deviasi . Integrasi dan penjumlahan dapat dipertukarkan karena integral ini terbatas. CDF ini kontinu dan cukup mudah untuk dihitung pada komputer, sehingga CDF terbalik, , juga dikenal sebagai fungsi kuantil, dapat dihitung dengan melakukan pencarian garis. Saya default untuk opsi ini karena tidak ada rumus sederhana untuk fungsi kuantil dari campuran normal, sebagai fungsi dari kuantil dari distribusi konstituen, datang ke pikiran.μ i σ i F - 1Fi(x)μiσiF−1
Kode R berikut secara numerik menghitung menggunakan pembagian dua untuk pencarian baris. Fungsi F_inv () adalah fungsi kuantil, Anda harus menyediakan vektor yang berisi setiap dan quantile yang harus dipecahkan untuk, . w i , μ i , σ i pF−1wi,μi,σip
# evaluate the function at the point x, where the components
# of the mixture have weights w, means stored in u, and std deviations
# stored in s - all must have the same length.
F = function(x,w,u,s) sum( w*pnorm(x,mean=u,sd=s) )
# provide an initial bracket for the quantile. default is c(-1000,1000).
F_inv = function(p,w,u,s,br=c(-1000,1000))
{
G = function(x) F(x,w,u,s) - p
return( uniroot(G,br)$root )
}
#test
# data is 50% N(0,1), 25% N(2,1), 20% N(5,1), 5% N(10,1)
X = c(rnorm(5000), rnorm(2500,mean=2,sd=1),rnorm(2000,mean=5,sd=1),rnorm(500,mean=10,sd=1))
quantile(X,.95)
95%
7.69205
F_inv(.95,c(.5,.25,.2,.05),c(0,2,5,10),c(1,1,1,1))
[1] 7.745526
# data is 20% N(-5,1), 45% N(5,1), 30% N(10,1), 5% N(15,1)
X = c(rnorm(5000,mean=-5,sd=1), rnorm(2500,mean=5,sd=1),
rnorm(2000,mean=10,sd=1), rnorm(500, mean=15,sd=1))
quantile(X,.95)
95%
12.69563
F_inv(.95,c(.2,.45,.3,.05),c(-5,5,10,15),c(1,1,1,1))
[1] 12.81730