【问题标题】:Rejection Sampling to generate Normal samples from Cauchy samples拒绝采样从 Cauchy 样本生成 Normal 样本
【发布时间】:2018-12-14 11:28:37
【问题描述】:

我尝试了编写拒绝抽样方法以生成遵循正态分布的样本的运气。乍一看,这些样本看起来像正态分布,但 Shapiro-Wilk 检验的 p 值始终

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

提前感谢您的帮助。

【问题讨论】:

    标签: r statistics normal-distribution


    【解决方案1】:

    实际上,我首先检查的是样本均值和样本方差。当我用你的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
    

    【讨论】:

    • 非常感谢。我试图同时进入统计和 R,所以我仍然犯了很多错误。我实际上使用了这样的随机统一变量,因为我的老师给了我伪代码,我试图让自己适应这个。还是再次感谢你。我想我现在理解得更好了。
    【解决方案2】:

    你有

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 2019-01-27
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多