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) 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 范围的结果。
- 那么这是否意味着 CDF 受到限制,但是 x = 10 ( 1 u^(1/3)) 可以是任何正整数?这是否意味着我的代码是正确的并且我不需要更改它?
- X = 10 (1 + U^(1/3)) 不能是任何正整数。由于 U ~ Uniform(0,1),X 被限制为 10 到 20 之间的十进制值,正如它应该的那样。这就是”健全性检查”测试的内容,以确保最小和最大的 U 分别产生最小和最大的 X。 (您也可以通过插入 U = 0.5 来获得 X 的中值。)
因为你想模拟一个分段函数,你的 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 |
n 是抽奖次数。 drawing_range 是您从中抽取的人口;例如,它可以来自 [-999, 999] 在这种情况下您输入 -999:999.
- 这是评估 CDF,而不是使用逆生成 Xs。无需使用反转来检查 X 的范围。
来源:https://www.codenong.com/49631960/