Necesito calcular cuartiles (Q1, mediana y Q3) en tiempo real en un gran conjunto de datos sin almacenar las observaciones. Primero probé el algoritmo P cuadrado (Jain / Chlamtac) pero no estaba satisfecho (demasiado uso de CPU y no me convenció la precisión al menos en mi conjunto de datos).
Ahora uso el algoritmo FAME ( Feldman / Shavitt ) para estimar la mediana sobre la marcha e intento derivar el algoritmo para calcular también Q1 y Q3:
M = Q1 = Q3 = first data value
step =step_Q1 = step_Q3 = a small value
for each new data :
# update median M
if M > data:
M = M - step
elif M < data:
M = M + step
if abs(data-M) < step:
step = step /2
# estimate Q1 using M
if data < M:
if Q1 > data:
Q1 = Q1 - step_Q1
elif Q1 < data:
Q1 = Q1 + step_Q1
if abs(data - Q1) < step_Q1:
step_Q1 = step_Q1/2
# estimate Q3 using M
elif data > M:
if Q3 > data:
Q3 = Q3 - step_Q3
elif Q3 < data:
Q3 = Q3 + step_Q3
if abs(data-Q3) < step_Q3:
step_Q3 = step_Q3 /2
Para resumir, simplemente usa la mediana M obtenida sobre la marcha para dividir el conjunto de datos en dos y luego reutilizar el mismo algoritmo para Q1 y Q3.
Esto parece funcionar de alguna manera, pero no puedo demostrarlo (no soy matemático). ¿Es defectuoso? Agradecería cualquier sugerencia o eventual otra técnica que se ajuste al problema.
Muchas gracias por su ayuda !
==== EDITAR =====
Para aquellos que estén interesados en tales preguntas, después de algunas semanas, finalmente terminé simplemente usando Reservoir Sampling con un revervoir de 100 valores y me dio resultados muy satisfactorios (para mí).
Respuestas:
La mediana es el punto en el que la mitad de las observaciones caen debajo y la mitad arriba. Del mismo modo, el vigésimo quinto percentil es la mediana de los datos entre el mínimo y la mediana, y el percentil 75 es la mediana entre la mediana y el máximo, así que sí, creo que estás en tierra firme aplicando cualquier algoritmo de mediana que uses primero todo el conjunto de datos para particionarlo, y luego en las dos piezas resultantes.
Actualización :
Esta pregunta sobre stackoverflow lleva a este artículo: Raj Jain, Imrich Chlamtac: El algoritmo P² para el cálculo dinámico de cuantiiles e histogramas sin almacenar observaciones. Commun. ACM 28 (10): 1076-1085 (1985) cuyo resumen indica que probablemente sea de gran interés para usted:
fuente
Un cambio muy leve en el método que publicó y puede calcular cualquier percentil arbitrario, sin tener que calcular todos los cuantiles. Aquí está el código de Python:
y un ejemplo:
fuente