Yo vagamente recuerdo de la escuela de posgrado que el siguiente es un enfoque válido para hacer un promedio ponderado de muestreo sin reemplazo:
- Empezar con un vacío inicialmente "muestreadas conjunto".
- Sorteo de una (sola) muestra ponderada con la sustitución con cualquiera que sea el método que usted tiene.
- Comprobar si ya has escogido.
- Si no, ignorarlo y pasar a la siguiente muestra. Si no, añadir a su conjunto muestreado.
- Repita 2-4 hasta que la muestra de conjunto es del tamaño deseado.
Será esto me da una válida ponderado de la muestra?
(Contexto: por muy grande de muestras, R sample(x,n,replace=FALSE,p)
toma un tiempo muy largo, mucho más largo que la aplicación de la estrategia anterior).
ACTUALIZACIÓN 2012-01-05
Gracias a todos por sus comentarios y respuestas! Sobre el código, he aquí un ejemplo que reproduce fielmente lo que yo estoy tratando de hacer (aunque en realidad estoy llamando R desde Python con RPy, pero parece que el tiempo de ejecución de las características son iguales).
En primer lugar, definir la siguiente función, que supone una suficientemente larga secuencia de con-reemplazo de muestras de entrada:
get_rejection_sample <- function(replace_sample, n) {
top = length(replace_sample)
bottom = 1
mid = (top+bottom)/2
u = unique(replace_sample[1:mid])
while(length(u) != n) {
if (length(u) < n) {
bottom = mid
}
else {
top = mid
}
mid = (top+bottom)/2
u = unique(replace_sample[1:mid])
if (mid == top || mid == bottom) {
break
}
}
u
}
Simplemente realiza una búsqueda binaria para el número de no-singulares muestras necesarias para obtener suficientes muestras únicas. Ahora, en el intérprete:
> x = 1:10**7
> w = rexp(length(x))
> system.time(y <- sample(x, 500, FALSE, w))
user system elapsed
12.820 0.048 12.902
> system.time(y <- get_rejection_sample(sample(x, 1000, TRUE, w), 500))
user system elapsed
0.311 0.066 0.378
Warning message:
In sample(x, 1000, TRUE, w) :
Walker's alias method used: results are different from R < 2.2.0
Como se puede ver, aunque sea por sólo 500 de los elementos que la diferencia es enorme. En realidad estoy tratando de muestra $10^6$ índices a partir de una lista de alrededor de $1.2 \times 10^7$, que tiene horas de uso replace=FALSE
.