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.
0 votos
@mbq: El muestreo aleatorio proporcionará rápidamente una aproximación razonable, especialmente con datos de buen comportamiento. Sin embargo, especifiqué que mi objetivo era una prueba exacta.
0 votos
@drknexus Por eso era un comentario y no una respuesta.
0 votos
Estoy seguro de que tienes alguna razón para hacer esto en R, pero ¿no sería más apropiado un lenguaje de bajo nivel como C si lo que buscas es velocidad? Sería más desagradable de codificar, pero se ejecutaría más rápido, sin duda.
0 votos
@Christopher: Sí, probablemente sería más rápido en C, pero dado que los resultados se están utilizando en R, parece más claro desde el punto de vista de la investigación reproducible utilizar sólo código R. Además, (la verdadera respuesta) me siento más cómodo en R que en C y aún no he aprendido a llamar código C desde R.
0 votos
Está intentando hacer una prueba de permutación, pero hay demasiadas combinaciones para un censo, así que es comprensible que quiera hacer un muestreo; esto es típico. Sin embargo, lo más habitual en esta situación es que se muestreen con sustitución en lugar de sin, lo que suele ser mucho más fácil de hacer. A no ser que esté muestreando una fracción apreciable de las combinaciones, el ligero aumento de la varianza merecerá el ahorro de tiempo y esfuerzo.
0 votos
@Glen_b Ciertamente. Esperaba que hubiera una bala mágica para reducir el tiempo y el esfuerzo de muestreo sin reemplazo, pero creo que las respuestas a esta pregunta demuestran que no existe tal bala.
0 votos
Hay algunos algoritmos para "numerar" las combinaciones y muestrearlas (que en muchas situaciones son razonablemente rápidos), pero una vez que los números crecen es realmente casi imposible elegir entre todas las combinaciones con igual probabilidad, porque el número de combinaciones crece tanto que los generadores de números pseudoaleatorios que la gente tiende a usar no generan suficientes valores para asignarles a todos una probabilidad efectivamente igual - de hecho, a menudo no lo hacen.