模拟双变量Pareto分布

时间:2018-01-24 11:06:14

标签: r simulation distribution correlation pareto-chart

我正在寻找一个可以生成双变量Pareto分布的包/代码,当两个随机变量相关时(并且可以由用户指定相关性)。我很感激你的帮助!

1 个答案:

答案 0 :(得分:3)

我无法找到任何现有的R套餐,但发现您的问题很有趣;所以我想向您介绍如何使用bivariate type I Pareto distributioninverse transform sampling进行抽样。

理论

I型双变量Pareto分布的联合pdf由

给出

enter image description here

这里的目标是

  1. 从边缘分布 f(x2)中抽取 x2 的样本,然后
  2. 从条件分布 f(x1 | x2)中给出 x2 x1 的样本。
  3. 边际和条件分布由(参见例如[Mardia, Annals of Mathematical Statistics 33, 1008 (1962)]

    给出

    enter image description here

    我们可以使用逆变换采样绘制样本,这需要边际和条件分布的累积分布函数。这很容易计算,我们得到了

    enter image description here

    x1 x2 的样本由

    给出

    enter image description here

    其中 u 是区间[0,1]中标准均匀分布的随机数。

    R实施

    1. 我们使用逆变换采样定义了两个函数,用于从边际和条件分布中对 x1 x2 的值进行采样,如上所述。

      rpareto_inv <- function(n, theta, a) {
          u <- runif(n, min = 0, max = 1);
          return(theta / (u ^ (1 / a)));
      }
      
      
      rpareto_cond_inv <- function(x2, theta1, theta2, a) {
        u <- runif(length(x2), min = 0, max = 1);
        return(theta1 + theta1 / theta2 * x2 * (1 / (u ^ (1 / (a + 1))) - 1));
      }
      
    2. 我们为采样和分配参数选择了一些值:

      n <- 10^5;     # Number of samples
      theta1 <- 5;   # Location parameter 1
      theta2 <- 2;   # Location parameter 2
      a <- 3;        # Shape parameter
      
    3. 现在我们可以绘制样本

      set.seed(2017);
      x2 <- rpareto_inv(n, theta = theta2, a = a);
      x1 <- rpareto_cond_inv(x2, theta1, theta2, a);
      
    4. 我们可以显示二维密度图,并将一些样本汇总统计数据与理论(人口)值进行比较。

      require(ggplot2);
      df <- cbind.data.frame(x1 = x1, x2 = x2);
      ggplot(df, aes(x1, x2)) +
          geom_density_2d() +
          xlim(theta1, 1.5 * theta1) +
          ylim(theta2, 1.5 * theta2);
      

      enter image description here

      metrics <- cbind.data.frame(
          obsrv = c(mean(df$x1), mean(df$x2), cor(df$x1, df$x2), cov(df$x1, df$x2)),
          theor = c(a * theta1 / (a - 1), a * theta2 / (a - 1), 1/a, theta1 * theta2 / ((a - 1)^2 * (a - 2))));
      rownames(metrics) <- c("Mean(x1)", "Mean(x2)", "Correlation", "Covariance")
      #                obsrv     theor
      #Mean(x1)    7.4947124 7.5000000
      #Mean(x2)    3.0029318 3.0000000
      #Correlation 0.3429634 0.3333333
      #Covariance  2.3376545 2.5000000
      

      你可以看到协议是好的。另请注意, x1 x2 之间的相关性由比例参数 a 表征。因此,如果要模拟具有特定相关性 r 的双变量Pareto分布的数据,则只需将shape参数设置为 1 / r 即可。有关分发和其他摘要统计信息的更多详细信息,请参阅[Mardia, Annals of Mathematical Statistics 33, 1008 (1962)]

    5. 最后,您还可以使用简单的接受拒绝采样方法,但我想这比我在此处显示的逆变换采样方法慢很多。