模拟随机样本的逆 CDF 方法
Inverse CDF method to simulate a random sample
我在编写这段代码时遇到问题,但我认为它可能存在问题。
这是问题:
编写一个名为 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< x <20,这会以任何方式影响我的代码吗?
谢谢
您是否将 X
的范围与样本大小混淆了?前者限制在(10, 20)范围内,后者可以是任意正整数。
您可以通过考虑 U = 0 和 U = 1 来对您的反演进行合理性检查,U = 0 应该(并且确实)产生 X
范围的最小值,并且 U = 1 应该并且确实产生范围的最大值。不需要范围限制你的反演,限制是在输入端使用 U(0,1),结合 CDF 是单调的 non-decreasing 的事实。因此,0 < U < 1 的 U 值不会产生 10 < X < 20 范围之外的结果。
由于您要模拟 piece-wise 函数,因此您的 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
.
我在编写这段代码时遇到问题,但我认为它可能存在问题。
这是问题: 编写一个名为 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< x <20,这会以任何方式影响我的代码吗?
谢谢
您是否将 X
的范围与样本大小混淆了?前者限制在(10, 20)范围内,后者可以是任意正整数。
您可以通过考虑 U = 0 和 U = 1 来对您的反演进行合理性检查,U = 0 应该(并且确实)产生 X
范围的最小值,并且 U = 1 应该并且确实产生范围的最大值。不需要范围限制你的反演,限制是在输入端使用 U(0,1),结合 CDF 是单调的 non-decreasing 的事实。因此,0 < U < 1 的 U 值不会产生 10 < X < 20 范围之外的结果。
由于您要模拟 piece-wise 函数,因此您的 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
.