Preciso calcular quartis (Q1, mediana e Q3) em tempo real em um grande conjunto de dados sem armazenar as observações. Tentei pela primeira vez o algoritmo do quadrado P (Jain / Chlamtac), mas não estava satisfeito com ele (um pouco de uso da CPU e não estava convencido pela precisão, pelo menos no meu conjunto de dados).
Eu uso agora o algoritmo FAME ( Feldman / Shavitt ) para estimar a mediana em tempo real e tento derivar o algoritmo para calcular também Q1 e 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 retomar, ele simplesmente usa a mediana M obtida em tempo real para dividir o conjunto de dados em dois e, em seguida, reutilizar o mesmo algoritmo para Q1 e Q3.
Isso parece funcionar de alguma forma, mas não sou capaz de demonstrar (não sou matemático). É falho? Gostaria de receber qualquer sugestão ou eventual outra técnica adequada ao problema.
Muito obrigado pela sua ajuda!
==== EDIT =====
Para aqueles que estão interessados em tais perguntas, depois de algumas semanas, finalmente acabei usando a Amostragem de Reservatório com um revervoir de 100 valores e deu resultados muito satististas (para mim).