从分布函数条件随机生成变量
Conditioned random generating variables from a distribution function
我的问题与我之前的问题有关
现在我想使用逆采样从分布函数生成随机变量,但采样应该是有条件的。
例如,如果我的 cdf 的倒数是:
invcdf <- function(y) a2 * log(a1/y - 1) + a3
我使用逆采样生成 10 个 rv 如下:
invcdf(runif(10))
现在,问题是我希望生成的值大于或小于某个值。
我应该如何在随机生成器中引入这个条件?
当我使用它获得大于 500 的值时:
invcdf(runif(10,500,1e6))
我收到此错误消息:
警告信息:
在 log((a0/y) - 1) 中:产生了 NaNs
我已经尝试重复该过程,直到值满足我的限制,但效率不高!
repeat{
x=invcdf(runif(1))
if(x>100){
break
}
您得到 NaN 的原因是 R 试图取负数的对数。您希望对数项是 log((a1/y)-1)
还是 log(a1/(y-1))
?您目前以第一种方式编写函数,当您获得非常高的 y 值时,a1/y
项趋近于零(它趋近于零的速度取决于 a1
的值)。因此,减去 1 会在 log 函数中得到一个负数。因此,如果该术语是按照您的书写方式 (log(a1/y-1)
) 计算的,您将无法计算出高于 y
.
的某些值
简单的修复就是
invcdf <- function(y){
a2 * log(a1/(y-1)) + a3
}
正如@spf614 指出的那样,您最好像
这样检查您的函数
invcdf <- function(y) {
if (a1 > y) {
return( a2 * log(a1/y - 1) + a3 )
}
NaN
}
然后它适用于所有参数
抽样
low <- ...
r <- invcdf(runif(low, a1, 1e6))
更新
检查输出中的 NaN
nof_nans <- sum(is.nan(r))
if (nof_nans > 0) {
....
我的问题与我之前的问题有关
invcdf <- function(y) a2 * log(a1/y - 1) + a3
我使用逆采样生成 10 个 rv 如下:
invcdf(runif(10))
现在,问题是我希望生成的值大于或小于某个值。 我应该如何在随机生成器中引入这个条件?
当我使用它获得大于 500 的值时:
invcdf(runif(10,500,1e6))
我收到此错误消息: 警告信息: 在 log((a0/y) - 1) 中:产生了 NaNs
我已经尝试重复该过程,直到值满足我的限制,但效率不高!
repeat{
x=invcdf(runif(1))
if(x>100){
break
}
您得到 NaN 的原因是 R 试图取负数的对数。您希望对数项是 log((a1/y)-1)
还是 log(a1/(y-1))
?您目前以第一种方式编写函数,当您获得非常高的 y 值时,a1/y
项趋近于零(它趋近于零的速度取决于 a1
的值)。因此,减去 1 会在 log 函数中得到一个负数。因此,如果该术语是按照您的书写方式 (log(a1/y-1)
) 计算的,您将无法计算出高于 y
.
简单的修复就是
invcdf <- function(y){
a2 * log(a1/(y-1)) + a3
}
正如@spf614 指出的那样,您最好像
这样检查您的函数invcdf <- function(y) {
if (a1 > y) {
return( a2 * log(a1/y - 1) + a3 )
}
NaN
}
然后它适用于所有参数
抽样
low <- ...
r <- invcdf(runif(low, a1, 1e6))
更新
检查输出中的 NaN
nof_nans <- sum(is.nan(r))
if (nof_nans > 0) {
....