如何模拟 Gumbel 双变量指数分布的数据

问题描述 投票:0回答:1

我正在写一篇论文,想要模拟 Gumbel 双变量指数分布 I 型和 II 型的数据。

这是 Gumbel 双变量分布: Here's the pdf of Gumbel Bivariate distribution

我尝试使用

rgumbel
包中的
Gumbel
函数,但该包考虑了
lambda1 = lambda2 = 1
,但就我而言,我想考虑不同的 lambda 值。

此外,我尝试使用边际实现逆 CDF 均匀采样方法,但没有成功,因为边际认为相关性=0。

如果有 R 包,请帮忙,如果没有,在 R 中从头开始模拟二元指数分布数据背后的概念是什么?

r
1个回答
2
投票

x2
为条件的
x1
的分布是具有形状参数 1 和 2 以及权重和公共速率参数的伽马混合,它们是
x1
和 GBVE 参数的函数。那么采样方案就是

  1. 从其边缘
    样本
    x1
  2. 样品
    x2
    条件为
    x1

在函数中实现(你可能想检查我的代数):

rGBVE <- function(n, lambda1, lambda2, theta) {
  x1 <- rexp(n, lambda1)
  lambda12 <- lambda1*lambda2
  pprod <- lambda12*theta
  C <- exp(lambda1*x1)
  A <- (lambda12 - pprod + pprod*lambda1*x1)/C
  B <- (pprod*lambda2 + pprod^2*x1)/C
  D <- lambda2 + pprod*x1
  wExp <- A/D
  wGamma <- B/D^2
  data.frame(x1, x2 = rgamma(n, (runif(n) > wExp/(wExp + wGamma)) + 1, D))
}

这将返回

n
中的
data.frame
样本。

更新

要得出此解决方案,请注意,当给出

x1
时,密度函数可以写成
(A + B*x2)/exp(logC + D*x2) = (A + B*x2)/(C*exp(D*x2)) = A/(C*D)*D*exp(-D*x2) + B/(C*D^2)*D^2*x2*exp(-D*x2)
的形式,其中
A
B
logC
C
D
对于给定的
x1
是常数。

D*exp(-D*x2)
是速率参数等于
D
的指数分布(或形状参数等于 1、速率参数等于
D
的伽马分布)的 PDF。
D^2*x2*exp(-D*x2)
是形状参数等于 2、速率参数等于
D
的伽玛分布的 PDF。
A/(C*D)
B/(C*D^2)
是混合分布的相对权重。

我仔细检查了我的代数,我相信它是正确的。该功能可以稍微简化一下(根据 JimB 的评论于 2024 年 9 月 20 日更新):

rGBVE <- function(n, lambda1, lambda2, theta) {
  x1 <- rexp(n, lambda1)
  term <- 1 + lambda1*theta*x1
  data.frame(x1, x2 = rgamma(n, (runif(n) > 1 - theta/term) + 1, lambda2*term))
}
© www.soinside.com 2019 - 2024. All rights reserved.