8 votos

¿Cómo puedo obtener algunas de las combinaciones posibles en R?

A veces quiero hacer una prueba exacta examinando todas las combinaciones posibles de los datos para construir una distribución empírica contra la que pueda probar mis diferencias observadas entre las medias. Para encontrar las posibles combinaciones suelo utilizar la función combn. La función choose puede mostrarme cuántas combinaciones posibles hay. Es muy fácil que el número de combinaciones sea tan grande que no sea posible almacenar el resultado de la función combn, por ejemplo, combn(28,14) requiere un vector de 2,1 Gb. Así que intenté escribir un objeto que recorriera la misma lógica que la función combn para proporcionar los valores de una "pila" imaginaria uno a uno. Sin embargo, este método (tal como lo instancié) es fácilmente 50 veces más lento que combn en tamaños de combinación razonables, lo que me lleva a pensar que también será dolorosamente lento para tamaños de combinación mayores.

¿Existe un algoritmo mejor para hacer este tipo de cosas que el algoritmo utilizado en combn? Concretamente, ¿hay una manera de generar y sacar la enésima combinación posible sin calcular a través de todas las combinaciones anteriores?

0 votos

¿Alguien ha notado que el número de preguntas que deberían estar en StackOverflow R se ha disparado aquí últimamente?

1 votos

¿Por qué no hacer un muestreo aleatorio?

4 votos

@John: Si te sientes así discute el tema en meta.stats.stackexchange.com/questions/248/ No hay necesidad de ser sarcástico.

6voto

Sean Carpenter Puntos 5588

Si desea cambiar la velocidad de procesamiento por la memoria (lo que creo que hace), sugeriría el siguiente algoritmo:

  • Establece un bucle de 1 a N Elige K, indexado por i
  • Cada i puede considerarse un índice de un combinada , decodificar como tal
  • Utilice la combinación para realizar su estadística de prueba, almacene el resultado, descarte la combinación
  • Repita

Esto le dará todas las N Elija K posibles combinaciones sin tener que crearlas explícitamente. Tengo código para hacer esto en R si lo quieres (puedes enviarme un correo electrónico a mark dot m period fredrickson at-symbol gmail dot com).

1 votos

Aquí hay un post con el código y algunas ilustraciones: markmfredrickson.com/thoughts/2010-08-06-combinadics-in-r.html

0 votos

Acepto esta respuesta porque resuelve (lo que creo) el más difícil de los problemas para los que buscaba una solución: elegir una combinación concreta sin calcular los valores anteriores. Por desgracia, sigue siendo muy lento. Tal vez, como se menciona aquí y en otros lugares, una búsqueda binaria ayudaría a acelerar las cosas. Tal vez el mejor enfoque es tener un hilo generando las combinaciones paso a paso como en la respuesta de mbq y otro hilo leyéndolas y probándolas.

1voto

ESRogs Puntos 1381

Generar combinaciones es bastante fácil, véase por ejemplo este ; escribir este código en R y luego procesar cada combinación a la vez que aparece.

0 votos

Pero, ¿podrá esto hacer frente a combinaciones muy grandes?

0 votos

@csgillespie Bueno, creo que sí funciona in situ De este modo, sólo se almacena en memoria una combinación a la vez, y los resultados de la simulación también pueden agregarse para eliminar la necesidad de almacenarlos. Por supuesto, esto funcionará durante mucho tiempo, pero las búsquedas exhaustivas suelen hacerlo. Para la velocidad podría ser escrito en C, pero entonces junto con la parte de simulación, que probablemente es mucho más lento que un paso del generador.

2 votos

Eso parece casi idéntico a cómo la función combn de R ya está haciendo las cosas. Escribí una versión de combn que saca las combinaciones de la pila de una en una, y como dice mbq porque sólo almacena una combinación en la memoria a la vez puede manejar combinaciones muy grandes. El problema con hacerlo en R es que hacer un enfoque paso a paso en una función típicamente implica leer las variables de estado en la función, manipularlas, y luego almacenarlas de nuevo en global - lo que parece ralentizar todo /way/.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X