2010-02-17 10 views
5

Supongamos que tengo una distribución discreta bivariada, es decir, una tabla de valores de probabilidad P (X = i, Y = j), para i = 1, ... n y j = 1 ,. ..metro. ¿Cómo puedo generar una muestra aleatoria (X_k, Y_k), k = 1, ... N de dicha distribución? Tal vez haya una función R lista como:Muestra aleatoria de una distribución discreta bivariada dada

sample(100,prob=biprob) 

donde biprob is 2 dimensional matrix?

Una forma intuitiva de muestra es la siguiente. Supongamos que tenemos un data.frame

dt=data.frame(X=x,Y=y,P=pij) 

donde X e Y provienen de

expand.grid(x=1:n,y=1:m) 

y pij son el P (X = I, Y = j).

A continuación, obtener la muestra (Xs, Ys) de tamaño N, de la siguiente manera:

set.seed(1000) 
Xs <- sample(dt$X,size=N,prob=dt$P) 
set.seed(1000) 
Ys <- sample(dt$Y,size=N,prob=dt$P) 

utilizo set.seed() para simular el "bivariateness". Intuitivamente, debería obtener algo similar a lo que necesito. Sin embargo, no estoy seguro de que esto sea correcto. De ahí la pregunta :)

Otra forma es utilizar el muestreo de Gibbs, las distribuciones marginales son fáciles de calcular.

Intenté googlear, pero no surgió nada realmente relevante.

Respuesta

7

Usted está casi allí. Suponiendo que tiene el marco de datos dt con los valores x, y, y pij, ¡simplemente muestree las filas!

dt <- expand.grid(X=1:3, Y=1:2) 
dt$p <- runif(6) 
dt$p <- dt$p/sum(dt$p) # get fake probabilities 
idx <- sample(1:nrow(dt), size=8, replace=TRUE, prob=dt$p) 
sampled.x <- dt$X[idx] 
sampled.y <- dt$Y[idx] 
+0

La lectura de este nuevo cuidado, esta es la misma solución como lo que sugiero. Las filas de muestreo son probablemente más limpias que la combinación de rmultinom y cuál. La clave es darse cuenta de que las filas y las columnas son solo notación. – Tristan

+0

Sí, la notación es la clave. La distribución discreta bivariada es igual a la distribución discreta univariada con notación modificada. Escojo la respuesta de Anika como la correcta, pero solo porque el código es más simple :) Tristan da una mejor explicación teórica. – mpiktas

+0

+1 para buen ejemplo – andi

7

No me queda claro por qué le importa que sea bivariante. Las probabilidades suman uno y los resultados son discretos, por lo que solo está tomando muestras de categorical distribution. La única diferencia es que está indexando las observaciones utilizando filas y columnas en lugar de una sola posición. Esto es solo notación.

En R, por lo tanto, puede muestrear fácilmente de su distribución mediante la remodelación de sus datos y el muestreo de una distribución categórica. El muestreo de una categoría se puede hacer usando rmultinom y usando which para seleccionar el índice, o, como sugiere Aniko, usando sample para muestrear las filas de los datos reformados. Algunos libros de contabilidad pueden encargarse de su caso exacto.

he aquí una solución:

library(reshape) 

# Reshape data to long format. 
data <- matrix(data = c(.25,.5,.1,.4), nrow=2, ncol=2) 
pmatrix <- melt(data) 

# Sample categorical n times. 
rcat <- function(n, pmatrix) { 
    rows <- which(rmultinom(n,1,pmatrix$value)==1, arr.ind=TRUE)[,'row'] 
    indices <- pmatrix[rows, c('X1','X2')] 
    colnames(indices) <- c('i','j') 
    rownames(indices) <- seq(1,nrow(indices)) 
    return(indices) 
} 

rcat(3,pmatrix) 

Esto devuelve 3 aleatoria empates de su matriz, informando de la i y j de las filas y columnas:

i j 
1 1 1 
2 2 2 
3 2 2 
Cuestiones relacionadas