假设我有一组我怀疑来自同一分布的数字.
set.seed(20130613)
x <- rcauchy(10)
Run Code Online (Sandbox Code Playgroud)
我想要一个从同一个未知分布中随机生成数字的函数.我想到的一种方法是创建一个density对象,然后从中获取CDF并获取随机统一变量的逆CDF (参见Wikipedia).
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
Run Code Online (Sandbox Code Playgroud)
我的问题如下:
sample)吗?Gre*_*now 11
要从密度估计生成数据,您只需随机选择一个原始数据点,并根据密度估计中的内核添加随机"错误"部分,默认情况下为"高斯",这意味着从中选择一个随机元素原始向量并添加一个随机法线,平均值为0,sd等于所用带宽:
den <- density(x)
N <- 1000
newx <- sample(x, N, replace=TRUE) + rnorm(N, 0, den$bw)
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用包中的logspline函数拟合密度logspline(使用估算密度的不同方法),然后使用该rlogspline包中的函数从估计的密度生成新数据.