寻找一种模拟这种分布的随机数的方法


20

我试图用R编写一个程序,该程序使用累积分布函数模拟来自分布的伪随机数:

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

其中a,b>0,p(0,1)

我尝试了逆变换采样,但是逆解析似乎无法解决。如果您可以提出解决方案,我将很高兴


1
没有足够的时间来获得完整的答案,但是您可以选择重要性抽样的算法。
一人为

1
这不是教科书练习,我只规定了约束条件,因为这是对我的数据的合理假设
Sebastian

6
然后,我对的“神奇”归一化感到惊讶,该归一化(p+1)1将分布变成了指数的理想幂,但是奇迹的确发生了(可能性很小)。
西安

Answers:


49

有一个简单的(且如果我可以添加,优雅)解决了这个运动:自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))

关联的R代码非常简单

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

并且绝对比逆pdf和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 

毫不奇怪的完美配合:

在此处输入图片说明


5
真的很酷的解决方案!
塞巴斯蒂安

14

您总是可以用数值方法求解逆变换。

下面,我做一个非常简单的二等分搜索。对于给定的输入概率(由于您的公式中已经有,所以我使用),我从和。然后我将直到。最后,我将等距直到其长度小于且其中点满足。qqpxL=0xR=1xRF(xR)>q[xL,xR]ϵxMF(xM)q

对于我对和选择,ECDF非常适合您的,并且速度相当快。您可能可以通过使用某些Newton型优化而不是简单的二等分搜索来加快速度。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")

欧洲发展基金


10

如果通过接受拒绝直接解决问题,则有些费解。首先,简单的区分表明分布的pdf为 其次,由于 我们有上限 第三,考虑的第二项,取变量,即。然后 是变量变化的雅可比行列式。如果

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
X密度为,其中是归一化常数,则的密度为 ,这意味着(i)为分布为指数变量,并且(ii)常数等于1。因此,结束是等于一个指数的权重相等混合物分布和的指数的次方κ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))分布,对缺失的乘法常数模,以计算权重: 而且,很容易作为混合物进行模拟。2
f(x)g(x)=2(12aeax+12bxpebxp+1/(p+1))
g

因此,接受拒绝算法的R渲染是

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)}

对于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])}

这是a = 1,b = 2,p = 3的图示:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.