反向CDF方法来模拟随机样本

时间:2018-04-03 13:56:44

标签: r function random inverse cdf

我有一个问题,我写了这段代码,但我认为它可能存在问题。

这是一个问题: 编写一个名为pr1的R函数,该函数模拟一个大小为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))#I在这里使用了逆CDF方法,我现在想要从分布中模拟大小为n的随机样本。

这是我的代码:

 pr1 = function(n)

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

 pr1(5)

#这只是为了检查一个n = 5的例子

我的问题是,因为CDF是10&lt; x <20,这会以任何方式影响我的代码吗?

谢谢

2 个答案:

答案 0 :(得分:0)

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

你可以通过考虑U = 0对你的反演进行健全性检查,它应该(并且确实)产生X范围的最小值,并且U = 1,这应该并且确实产生最大值范围。没有必要对你的反演进行范围限制,这种限制是在输入端使用U(0,1)&s而结合CDF单调非递减的事实。因此,没有U的值使得0 <0。 U&lt; 1可以产生10 <范围之外的结果。 X&lt; 20。

答案 1 :(得分:-1)

由于你想要模拟分段函数,你的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