繁体   English   中英

拒绝采样从柯西样本中生成正态样本

[英]Rejection Sampling to generate Normal samples from Cauchy samples

我尝试通过编码拒绝采样方法来生成遵循正态分布的样本的方法很幸运。 乍一看,样本看起来像正态分布,但Shapiro-Wilk检验的p值始终<0.05。 我真的不知道我哪里出了问题,我只从老师那儿得到了伪代码(不是作业)。 任何帮助表示赞赏。 在我的代码下面:

f <- function(x,m,v) {    #target distribution, m=mean,v=variance
  dnorm(x,m,sqrt(v))
}

g <- function(x,x0,lambda) {  #cauchy distribution for sampling
  dcauchy(x,x0,lambda)
}

genSamp <- function(n,m,v) {  #I want the user to be able to choose mean and sd
                              #and size of the sample
  stProbe <- rep(0,n)         #the sample vector
  interval = c(m-10*sqrt(v),m+10*sqrt(v)) #wanted to go sure that everything
                                          #is covered, so I took a range
                                          #that depends on the mean
  M = max(f(interval,m,v)/g(interval,m,v))  #rescaling coefficient, so the cauchy distribution
                              #is never under the normal distribution
  #I chose x0 = m and lambda = v, so the cauchy distribution is close to a
  #the target normal distribution

  for (i in 1:n) {
    repeat{
      x <- rcauchy(1,m,v)
      u <- runif(1,0,max(f(interval,m,v)))
      if(u < (f(x,m,v)/(M*g(x,m,v)))) {
        break
      }
    }
    stProbe[i] <- x
  }

  return(stProbe)
}

然后我尝试了:

test <- genSamp(100,2,0.5)
hist(test,prob=T,breaks=30)#looked not bad
shapiro.test(test) #p-value way below 0.05

预先感谢您的帮助。

实际上,我检查的第一件事是样本均值和样本方差。 当我用genSamp绘制1000个样本时,样本均值是2,但样本方差是2.64,离目标0.5远。

第一个问题是您对M的计算。 注意:

interval = c(m - 10 * sqrt(v), m + 10 * sqrt(v))

只给您2个值,而不是间隔上等距点的网格。 与平均值相差10个标准偏差时,“正常”密度几乎为0,因此M几乎为0。您需要执行以下操作

interval <- seq(m - 10 * sqrt(v), m + 10 * sqrt(v), by = 0.01)

第二个问题是在repeat生成统一随机变量。 你为什么要做

u <- runif(1,0,max(f(interval,m,v)))

你要

u <- runif(1, 0, 1)

通过这些修复,我测试了genSamp可以获取正确的样本均值和样本方差。 样品均通过了Shapiro-Wilk测试和Kolmogorov-Smirnov测试( ?ks.test )。


完整的工作代码

f <- function(x,m,v) dnorm(x,m,sqrt(v))

g <- function(x,x0,lambda) dcauchy(x,x0,lambda)

genSamp <- function(n,m,v) {

  stProbe <- rep(0,n)
  interval <- seq(m - 10 * sqrt(v), m + 10 * sqrt(v), by = 0.01)
  M = max(f(interval,m,v)/g(interval,m,v))

  for (i in 1:n) {
    repeat{
      x <- rcauchy(1,m,v)
      u <- runif(1,0,1)
      if(u < (f(x,m,v)/(M*g(x,m,v)))) break
      }
    stProbe[i] <- x
    }

  return(stProbe)
  }

set.seed(0)
test <- genSamp(1000, 2, 0.5)
shapiro.test(test)$p.value
#[1] 0.1563038

ks.test(test, rnorm(1000, 2, sqrt(0.5)))$p.value
#[1] 0.7590978

你有

f <- function(x,m,v) {    #target distribution, m=mean,v=variance
  dnorm(x,e,sqrt(v))
}

哪个样本的平均值为e ,但从未定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM