我有一个问题,我写了这段代码,但我认为它可能存在问题。
这是一个问题: 编写一个名为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,这会以任何方式影响我的代码吗?
谢谢
答案 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
。