Capítulo 5 Simulación de variables discretas

Se trata de simular una variable aleatoria discreta \(X\) con función de masa de probabilidad: \[\begin{array}{l|ccccc} x_{i} & x_{1} & x_{2} & \cdots & x_{n} & \cdots \\ \hline P\left( X=x_{i}\right) & p_{1} & p_{2} & \cdots & p_{n} & \cdots \end{array}\]

Considerando como partida una \(\mathcal{U}\left( 0,1\right)\), la idea general consiste en asociar a cada posible valor \(x_{i}\) de \(X\) un subintervalo de \(\left( 0,1\right)\) de longitud igual a la correspondiente probabilidad. Por ejemplo, como ya se mostró en capítulos anteriores, es habitual emplear código de la forma:

x <- runif(nsim) < p

para simular una distribución \(Bernoulli(p)\).

Otro ejemplo es la distribución uniforme discreta en \(\{1,2,\ldots,n\}\), con función de masa de probabilidad dada por \[p_{j}=\frac{1}{n}\text{, para }j=1,2,\ldots n.\] Pueden generarse valores de esta distribución de forma muy eficiente truncando la distribución uniforme:

Algoritmo 5.1 (distribución uniforme discreta)

  1. Generar \(U\sim \mathcal{U}\left( 0,1\right)\).

  2. Devolver \(X=\left\lfloor nU\right\rfloor + 1\).

Sin embargo, para generar variables discretas con dominio finito en R, si no se dispone de un algoritmo específico más eficiente, es recomendable emplear la función sample() del paquete base. En el caso general20:

sample(x = valores, size = nsim, replace = TRUE, prob)

implementa eficientemente el método “alias” que describiremos más adelante, en la Sección 5.3.


  1. En el caso de que x = n sea un entero (o un escalar) generará valores de una distribución uniforme discreta (equivalente a sample(x = 1:n, ...) o sample.int(n, ...)).↩︎