使用已知分布在 R 中模拟连续联合 pdf

机器算法验证 r 自习 数理统计
2022-03-27 15:18:27

我正在尝试如下模拟连续联合 pdf,以便我可以验证我对问题集的解决方案。联合 pdf 为否则我发现的边际 pdf为,这是一个很好的 beta 分布。我的想法是,我发现它是,但我无法使用这些 x 值的已知分布。有任何想法吗?

f(x,y)=24x(1y) for 0xy1
0y12y2(1y)xFX|Y(X|Y)x2y2

我模拟了 y 值如下: y = rbeta(10000,3,2)

1个回答

有很多方法可以模拟这个二元随机向量。可能最有效的方法是导出一个变量的边际分布和另一个变量的条件分布,然后使用这些分布单独模拟变量。

另一种效率较低但不需要导出边际分布和条件分布的替代方法是使用拒绝抽样在这种情况下,最简单的方法是在单位正方形上使用均匀的生成分布。我们有一个二元连续随机向量 ,在支持上具有有界密度因此,我们可以生成然后以接受概率接受生成的值:(X,Y)fS[0,1]2X,YIID U[0,1]

A(x,y)f(x,y)sup(x,y)Sf(x,y)=24x(1y)I(xy)24=x(1y)I(xy).

将此方法编程到R. 在下面的代码中,我们创建了一个函数,该函数SIMULATE接受一个输入n并生成一个矩阵,其中包含所讨论的二元随机向量的这么多输出。(矩阵有两列代表两个变量;每一行是随机向量的一个模拟值。)

#Create function to simulate vectors from specified distribution
SIMULATE <- function(n) {

  #Set output matrix
  OUT <- matrix(NA, nrow = n, ncol = 2);
  colnames(OUT) <- c('X','Y');

  #Undertake rejection sampling
  for (i in 1:n) {

    ACCEPT <- FALSE;
    while (!ACCEPT) {

      #Simulate proposed values
      X <- runif(1);
      Y <- runif(1);  

      #Determine acceptance
      AA <- X*(1-Y)*(X <= Y);
      ACCEPT <- (runif(1) <= AA); } 

    OUT[i,] <- c(X,Y); }

OUT; }

我们可以使用这个函数来模拟来自这个分布的任意数量的二元输出。下面我们模拟输出。n=103

#Set the seed
set.seed(75375211);

#Generate simulations and show the first few values
SIMULATIONS <- SIMULATE(1000);
head(SIMULATIONS);

              X         Y
[1,] 0.4124875 0.4681140
[2,] 0.1345465 0.1565690
[3,] 0.4703997 0.4810464
[4,] 0.6532923 0.8114625
[5,] 0.5971606 0.6286653
[6,] 0.6476007 0.8088133