【问题标题】:Simulation of random variables using Polar method使用 Polar 方法模拟随机变量
【发布时间】:2019-09-20 04:25:22
【问题描述】:

我有以下算法

Step 1. 生成u1和u2~U(0,1)

第 2 步。定义 v1=2u1-1、v2=2u2-1 和 s=v1^2+v2^2

步骤 3。如果 s>1,返回步骤 1。

第 4 步。如果 s

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

    PolarMethod1<-function(N)
{

  x<-numeric(N)
  y<-numeric(N)
  z<-numeric(N)

  i<-1

  while(i<=N)
  {u1<-runif(1)
  u2<-runif(1)
  v1<-(2*u1)-1
  v2<-(2*u2)-1
  s<-(v1^2)+(v2^2)

  if(s<=1)
  {
    x[i]<-((-2*log(s)/s)^(1/2))*v1
    y[i]<-((-2*log(s)/s)^(1/2))*v2
    z[i]<-(x[i]+y[i])/sqrt(2) #standarization
    i<-i+1
  }
  else
    i<-i-1
  }

  return(z)
}
z<-PolarMethod1(10000)
hist(z,freq=F,nclass=10,ylab="Density",col="purple",xlab=" z values")
curve(dnorm(x),from=-3,to=3,add=TRUE)

幸运的是,该代码没有标记任何错误并且与N=1000 配合得很好,但是当我更改为N=10000 时,并没有更好地处理曲线显示:

与 N=1000 个显示器的对比:

这是为什么呢?

我的代码有问题吗?当N 增加时应该会更好地调整。

注意:我在代码中添加了z 以在输出中包含这两个变量。

【问题讨论】:

  • 代码还正确返回了N=1000 z 值。

标签: r algorithm random plot statistics


【解决方案1】:

为什么 1000 次和 100000 次运行之间存在差异?

当您运行 1000 次模拟时,z 值通常从 -3.2 变为 3.2。但是,如果将运行次数增加到 100k,您将获得更多的极值,z 将从 -4 变为 4。

直方图将 z 结果分成 10 个 bin。 z 的较大范围会导致更宽的 bin,而更宽的 bin 通常对概率密度的调整更差。

1000 次运行的 bin 宽度大约为 0.5,但 100k 为 1。

【讨论】:

    【解决方案2】:

    您在绘制直方图时要求 10 个 bin,但这只是一个建议。你实际上得到了 8,因为要覆盖从 -4 到 4 的范围,没有分成 10 个 bin 以得到很好的整数,而 8 个 bin 有很好的边界。

    如果您想要更多 bin,请不要指定 nclass。默认给了我 20 个垃圾箱。或者指定breaks = "Scott",它使用不同的规则来选择垃圾箱。我看到大约 80 个垃圾箱使用了这个选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多