Estoy tratando de trazar un diagrama QQ con dos conjuntos de datos de aproximadamente 1,2 millones de puntos, en R (usando qqplot y alimentando los datos en ggplot2). El cálculo es bastante fácil, pero el gráfico resultante es muy lento de cargar, porque hay muchos puntos. He intentado una aproximación lineal para reducir el número de puntos a 10000 (esto es lo que hace la función qqplot de todos modos, si uno de sus conjuntos de datos es más grande que el otro), pero luego pierde muchos detalles en las colas.
La mayoría de los puntos de datos hacia el centro son básicamente inútiles: se superponen tanto que probablemente haya aproximadamente 100 por píxel. ¿Hay alguna forma simple de eliminar datos que estén demasiado juntos, sin perder los datos más dispersos hacia las colas?
fuente
approx()
función entra en juego en laqqplot()
función.Respuestas:
Las gráficas QQ están increíblemente autocorrelacionadas, excepto en las colas. Al revisarlos, uno se enfoca en la forma general de la trama y en el comportamiento de la cola. Ergo , lo harás bien submuestreando groseramente en los centros de las distribuciones e incluyendo una cantidad suficiente de las colas.
Aquí hay un código que ilustra cómo muestrear un conjunto de datos completo y cómo tomar valores extremos.
Para ilustrar, este conjunto de datos simulado muestra una diferencia estructural entre dos conjuntos de datos de aproximadamente 1,2 millones de valores, así como una muy pequeña cantidad de "contaminación" en uno de ellos. Además, para que esta prueba sea estricta, se excluye un intervalo de valores de uno de los conjuntos de datos por completo: el gráfico QQ debe mostrar un salto para esos valores.
Podemos submuestrear el 0.1% de cada conjunto de datos e incluir otro 0.1% de sus extremos, dando 2420 puntos para trazar. El tiempo total transcurrido es inferior a 0,5 segundos:
No se pierde información alguna:
fuente
sin
? ¿Tengo razón en que un CDF normal sería una mejor función, si asumiera que la x se distribuye normalmente? ¿Acabas de elegir el pecado porque es más fácil de calcular?En otra parte de este hilo propuse una solución simple pero algo ad hoc de submuestreo de puntos. Es rápido, pero requiere algo de experimentación para producir grandes parcelas. La solución a punto de describirse es un orden de magnitud más lento (que demora hasta 10 segundos por 1.2 millones de puntos) pero es adaptativo y automático. Para grandes conjuntos de datos, debería dar buenos resultados la primera vez y hacerlo razonablemente rápido.
Hay algunos detalles a tener en cuenta, especialmente para hacer frente a conjuntos de datos de diferente longitud. Hago esto reemplazando el más corto por los cuantiles correspondientes al más largo: en efecto, se usa una aproximación lineal por partes del FED del más corto en lugar de sus valores de datos reales. ("Más corto" y "más largo" se pueden revertir configurando
use.shortest=TRUE
).Aquí hay una
R
implementación.Como ejemplo, uso datos simulados como en mi respuesta anterior (con un valor atípico extremadamente alto
y
y bastante más contaminación enx
este momento):Tracemos varias versiones, utilizando valores cada vez más pequeños del umbral. Con un valor de .0005 y que se muestra en un monitor de 1000 píxeles de altura, estaríamos garantizando un error de no más de la mitad de un píxel vertical en todas partes del gráfico. Esto se muestra en gris (solo 522 puntos, unidos por segmentos de línea); las aproximaciones más gruesas se trazan en la parte superior: primero en negro, luego en rojo (los puntos rojos serán un subconjunto de los negros y los trazarán en exceso), luego en azul (que nuevamente son un subconjunto y una sobreparcela). Los tiempos varían de 6.5 (azul) a 10 segundos (gris). Dado que escalan tan bien, uno podría usar aproximadamente medio píxel como valor predeterminado universal para el umbral ( por ejemplo , 1/2000 para un monitor de 1000 píxeles de altura) y terminar con él.
Editar
He modificado el código original para
qq
devolver una tercera columna de índices en la más larga (o más corta, como se especifica) de las dos matrices originales,x
yy
, correspondiente a los puntos que se seleccionan. Estos índices apuntan a valores "interesantes" de los datos y, por lo tanto, podrían ser útiles para su posterior análisis.También eliminé un error que ocurría con valores repetidos de
x
(que causabanbeta
ser indefinidos).fuente
qq
los argumentos de un vector dado? Además, ¿podría aconsejar sobre el uso de suqq
función con elggplot2
paquete? Estaba pensando en usarggplot2
'sstat_function
para esto.Eliminar algunos de los puntos de datos en el medio cambiaría la distribución empírica y, por lo tanto, el qqplot. Dicho esto, puede hacer lo siguiente y trazar directamente los cuantiles de la distribución empírica frente a los cuantiles de la distribución teórica:
Tendrás que ajustar la secuencia dependiendo de qué tan profundo quieras llegar a las colas. Si quieres ser inteligente, también puedes reducir esa secuencia en el medio para acelerar la trama. Por ejemplo usando
Es una posibilidad.
fuente
Podrías hacer un
hexbin
complot.fuente
Otra alternativa es un diagrama de caja paralelo; dijiste que tenías dos conjuntos de datos, así que algo como:
y puede ajustar las diversas opciones para mejorarlo con sus datos.
fuente