假设我有一组数字,我怀疑它们来自同一分布。
set.seed(20130613)
x <- rcauchy(10)
我想要一个从相同的未知分布中随机生成一个数字的函数。我想到的一种方法是创建一个density
对象,然后从中获取 CDF,并取随机均匀变量的逆 CDF(参见维基百科) http://en.wikipedia.org/wiki/Inverse_transform_sampling.
den <- density(x)
#' Generate n random numbers from density() object
#'
#' @param n The total random numbers to generate
#' @param den The density object from which to generate random numbers
rden <- function(n, den)
{
diffs <- diff(den$x)
# Making sure we have equal increments
stopifnot(all(abs(diff(den$x) - mean(diff(den$x))) < 1e-9))
total <- sum(den$y)
den$y <- den$y / total
ydistr <- cumsum(den$y)
yunif <- runif(n)
indices <- sapply(yunif, function(y) min(which(ydistr > y)))
x <- den$x[indices]
return(x)
}
rden(1, den)
## [1] -0.1854121
我的问题如下:
- 是否有更好的(或内置在 R 中)方法从密度对象生成随机数?
- 关于如何从一组数字生成随机数还有其他想法吗(除了
sample
)?
要从密度估计生成数据,您只需随机选择一个原始数据点,并根据密度估计的内核添加随机“错误”部分,对于默认的“高斯”,这仅意味着从原始向量并添加平均值为 0 且标准差等于所用带宽的随机法线:
den <- density(x)
N <- 1000
newx <- sample(x, N, replace=TRUE) + rnorm(N, 0, den$bw)
另一种选择是使用以下公式来拟合密度logspline
函数从logspline
包(使用不同的方法来估计密度),然后使用rlogspline
该包中的函数可根据估计的密度生成新数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)