不幸的是,标准法线(由于法线是一个位置尺度族,因此可以确定所有其他标准线)的分位数函数不允许采用封闭形式(即“漂亮公式”)。与闭合形式最接近的是标准正态分位数函数是满足微分方程的函数w
d2wdp2=w(dwdp)2
且初始条件且。在大多数计算环境中,都有一个函数以数字方式计算正常的分位数函数。在R中,您可以输入w(1/2)=0w′(1/2)=2π−−√
qnorm(p, mean=mu, sd=sigma)
以获得分布的个分位数。pN(μ,σ2)
编辑:对问题的理解有所修改,数据是从法线混合生成的,因此观察到的数据的密度为:
p(x)=∑iwipi(x)
其中,每个是一些平均密度,均值和标准偏差。因此,观察到的数据的CDF为∑iwi=1pi(x)μiσi
F(y)=∫y−∞∑iwipi(x)dx=∑iwi∫y−∞pi(x)=∑iwiFi(y)
其中是具有平均值和标准偏差的正常CDF 。积分和求和可以互换,因为这些积分是有限的。该CDF连续且容易在计算机上计算,因此可以通过进行行搜索来计算CDF的倒数,也称为分位数函数。我默认使用此选项,因为没有想到一个简单的公式来表示正态混合的分位数函数,它是成分分布的分位数的函数。μ 我 σ 我 ˚F - 1Fi(x)μiσiF−1
以下R代码使用二等分进行线搜索,以数值方式计算。函数F_inv()是分位数函数,您需要提供包含每个以及要求解的分位数。瓦特我,μ 我,σ 我 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