【问题标题】:Inverse CDF method to simulate a random sample模拟随机样本的逆 CDF 方法
【发布时间】:2018-09-12 21:23:24
【问题描述】:

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

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

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的随机样本。

这是我的代码:

 pr1 = function(n)

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

 pr1(5)

#这只是为了检查 n=5 的示例

我的问题是,由于 CDF 为 10

谢谢

【问题讨论】:

    标签: r function random inverse cdf


    【解决方案1】:

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

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

    【讨论】:

    • 这是否意味着 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 的中位数。)
    【解决方案2】:

    由于您要模拟分段函数,因此您的 R 函数应包含一些流控制,例如 if

    这是一个开始:

    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。无需使用倒置检查Xs 的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2021-03-12
    • 2019-09-20
    • 1970-01-01
    相关资源
    最近更新 更多