Diciamo che ho una serie di numeri che sospetto provengano dalla stessa distribuzione.Generare un numero casuale da un oggetto densità (o più genericamente da un insieme di numeri)
set.seed(20130613)
x <- rcauchy(10)
Vorrei una funzione che generi a caso un numero dalla stessa distribuzione sconosciuta. Un approccio che ho pensato è quello di creare un oggetto density
e quindi ottenere il CDF da quello e prendere il CDF inverso di una variabile uniforme casuale (see 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
Le mie domande sono le seguenti:
- C'è un modo migliore (o integrato in R) per generare un numero casuale da un oggetto densità?
- Ci sono altre idee su come generare un numero casuale da un insieme di numeri (oltre a
sample
)?
La teoria alla base di questo è molto più sottile. Come viene stimata la densità? Quale kernel è usato? Ci sono fasce di fiducia attorno a questa stima? Potrebbe essere un modello di miscela? eccetera. –