同じ分布から来ていると思われる一連の数値があるとします。
set.seed(20130613)
x <- rcauchy(10)
同じ未知の分布からランダムに数値を生成する関数が欲しいです。私が考えた 1 つのアプローチは、density
オブジェクトを作成し、そこから CDF を取得し、一様確率変数の逆 CDF を取得することです(ウィキペディアを参照)。
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
)?