关于r:模拟随机样本的逆CDF方法 | 珊瑚贝

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 范围的结果。

  • 那么这是否意味着 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 <- 0
    else if ( 10 < x < 20 )
         output <- (x-10)^3/1000
    else
         output <- 1

    output
}

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

  • 这是评估 CDF,而不是使用逆生成 Xs。无需使用反转来检查 X 的范围。


来源:https://www.codenong.com/49631960/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9327.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?