关于r:模拟随机样本的逆CDF方法

 2022-02-12 

Inverse CDF method to simulate a random sample

我在编写这段代码时遇到了问题,但我认为它可能存在问题。

这是一个问题:
编写一个名为 pr1 的 R 函数,该函数从 CDF 的分布中模拟大小为 n 的随机样本,CDF 为..

1
2
3
F_X(x) = 0 for x<=10
     (x-10)^3/1000 for 10<x<20
    1 for x=>20

x = 10 ( 1 u^(1/3)) #我在这里使用了逆CDF方法,现在我想从分布中模拟一个大小为n的随机样本。

这是我的代码:

1
2
3
4
5
6
7
 pr1 = function(n)

 { u = runif(n,0,1)
   x = 10 * ( 1 + u^(1/3))
   x }

 pr1(5)

#这只是为了检查 n=5

的示例

我的问题是,由于 CDF 是 10< x <20,这会以任何方式影响我的代码吗?

谢谢


您是否将 X 的范围与样本大小混淆了?前者限制在 (10, 20) 范围内,后者可以是任意正整数。

你可以通过考虑 U = 0 来对你的反演进行完整性检查,它应该(并且确实)产生 X 范围的最小值,而 U = 1,它应该并且确实产生最大值范围。没有必要限制你的反转范围,限制是内置在输入端使用 U(0,1) 的,再加上 CDF 是单调非递减的。因此,没有使 0 < U < 1 的 U 值可以产生超出 10 < X < 20 范围的结果。


因为你想模拟一个分段函数,你的 R 函数应该包含一些流控制,比如 if.

这是一个开始:

1
2
3
4
5
6
7
8
9
10
11
12
13
pr1 = function(n, drawing_range){

    x <- sample(drawing_range, size = n) # random drawing of x

    if (x <= 10)  
         output <- 0
    else if ( 10 < x < 20 )
         output <- (x-10)^3/1000
    else
         output <- 1

    output
}

n 是抽奖次数。 drawing_range 是您从中抽取的人口;例如,它可以来自 [-999, 999] 在这种情况下您输入 -999:999.