用接受 - 拒绝法模拟随机变量

问题描述 投票:1回答:1

我有以下算法

步骤1.用qj = P(Y = j)模拟Y的值

步骤2.生成统一变量

步骤3.如果U <= Pj /(c * qj)则X = j并停止。否则回到第1步。

具体的例子如下:

X = 1,2,3,4,P1 = 0.2,P2 = .15,P3 = .25,P4 = .4

生成X的值

  1. 光Y~UD(1.4)
  2. C = 0.4 / 0.25

以下是我在R中实现此算法的方法:

f<-function(){
n<-4

probY<-c(.25,.25,.25,.25)
probX<-c(2,.15,.25,.4)

X<-rep(0,4)

U<-runif(n)

c<-.4/.25

for(j in 1:4)
{
if(U[j]<= probX[j]/(c*probY[j]))
   X<-j

}


return(X)

}

输出是4我不认为是正确的。我不确定如果我应该写Y<-runif(n,1,4)也不是这行probY<-c(.25,.25,.25,.25)。这一行'否则回到第1步'。在循环中缺失,但总是相同的.25

有人可以帮忙吗?

r algorithm simulation
1个回答
2
投票

我认为这里的问题与算法的工作原理有点混淆。

为了从您的分布中生成单个值(X = 1,2,3,4,其中P(X = 1)=。2,P(X = 2)=。15,P(X = 3)= .25 ,P(X = 4)= .4),我们需要按照算法的步骤。假设我们选择c = .4 / .25:

1.从Y~UD(1,4)生成y。

2.从U~U(0,1)生成你。

3.检查u≤f(y)/ cg(y)。如果是,请定义x = y,然后就完成了!如果没有,请返回步骤1。

在您给出的代码中,您实际上从未生成过y变量。这是一个应该适合你的功能!希望我的评论能够解释得很好!

accRej <- function(){

  #The probabilities for generating a r.v. from X
  probX <- c(.2,.15,.25,.4)

  #The Value for c
  c <- .4/.25

  #x is a placeholder for our final value of x 
  #and i is a counter variable which will allow us to stop the loop when we complete step 3
  x <- numeric(1)
  i <- 1

  #Now, start the loop!
  while(i <= 1){
    #Step 1, get y
    y <- sample(1:4,1)
    #Step 2, get u
    u <- runif(1)
    #Step 3, check to see if the inequality holds
    #If it does, assign y to x and add 1 to i (making it 2) to stop the while loop
    #If not, do nothing and try again!
    if(u <= probX[y]/c*.25){
      x[i] <- y
      i <- i+1
    }
  }
  #Return our value of x
  return(x)
}

请注意,在此代码中,probX[i]在我们的算法中等于f(y),并且因为Y~UD(1,4),所以.25 = g(y)。希望这可以帮助!

此外,这里是使用此方法生成n随机变量的代码。它基本上与上面相同,只是选择将1更改为n

accRej <- function(n){

  #The probabilities for generating a r.v. from X
  probX <- c(.2,.15,.25,.4)

  #The Value for c
  c <- .4/.25

  #x is a placeholder for our final value of x 
  #and i is a counter variable which will allow us to stop the loop when we complete step 3
  x <- numeric(n)
  i <- 1

  #Now, start the loop!
  while(i <= n){
    #Step 1, get y
    y <- sample(1:4,1)
    #Step 2, get u
    u <- runif(1)
    #Step 3, check to see if the inequality holds
    #If it does, assign y to x and add 1 to i
    #If not, do nothing and try again!
    if(u <= probX[y]/c*.25){
      x[i] <- y
      i <- i+1
    }
  }
  #Return our value of x
  return(x)
}
© www.soinside.com 2019 - 2024. All rights reserved.