从没有封闭形式的逆 Cdf 生成随机样本

机器算法验证 r 分布 随机生成
2022-03-21 08:04:02

我正在研究一个特定的分布,其逆 cdf 不以封闭形式存在。分布的 cdf 由下式给出

F(x;d,m,p,α,β)=1(1+xm)dexp(βxα)1p(1+xm)dexp(βxα)

为严格正m,d,α,β0<p<1.

我的问题是我是这个R包的新手,我需要使用R.

1个回答

这里有两种计算 cdf 倒数的数值近似值的方法,假设您已经选择了 m,d,α,β 和 p。这两种方法都要求您可以计算给定 x 的 F(x),所以...

m = 1
d = 2
a = 1
b = 2
p = 0.5
F = function(x) (1 - ((1+x^m)^-d) * exp(-b*x^a))  / 
    (1 - (p*(1+x^m)^-d) * exp(-b*x^a)) 

方法一

要计算 InvF(a),请求解方程 F(x) = a

InvF1 = function(a) uniroot(function(x) F(x) - a, c(0,10))$root
InvF1(0.5)
[1] 0.1038906
F(InvF1(0.5))
[1] 0.4999983

方法二

为一系列 x 计算 y = F(x),然后将曲线拟合到 x 作为 y 的函数。

x = c(seq(0,3, 0.001), seq(3.1,10,0.1))
y = F(x)
InvF2 = approxfun(y, x)

InvF2(0.5)
[1] 0.1038916
F(InvF2(0.5))
[1] 0.5000011

您可以InvF2通过使用更密集的 x 采样来提高准确度,特别是对于 x 的小值。