Esta solución implementa una sugerencia hecha por @Innuo en un comentario a la pregunta:
Puede mantener un subconjunto aleatorio muestreado uniformemente de tamaño 100 o 1000 a partir de todos los datos vistos hasta ahora. Este conjunto y las "cercas" asociadas se pueden actualizar en tiempo.O(1)
Una vez que sepamos cómo mantener este subconjunto, podemos seleccionar cualquier método que nos guste para estimar la media de una población a partir de dicha muestra. Este es un método universal, sin hacer ninguna suposición, que funcionará con cualquier flujo de entrada con una precisión que pueda predecirse utilizando fórmulas de muestreo estadístico estándar. (La precisión es inversamente proporcional a la raíz cuadrada del tamaño de la muestra).
Este algoritmo acepta como entrada una secuencia de datos un tamaño de muestra , y genera una secuencia de muestras cada una de las cuales representa la población . Específicamente, para , es una muestra aleatoria simple de tamaño de (sin reemplazo).t = 1 , 2 , … , m s ( t ) X ( t ) = ( x ( 1 ) , x ( 2 ) , … , x ( t ) ) 1 ≤ i ≤ t s ( i ) m X ( t )x(t), t=1,2,…,ms(t)X(t)=(x(1),x(2),…,x(t))1≤i≤ts(i)mX(t)
Para que esto suceda, es suficiente que cada subconjunto de elementos de tenga las mismas posibilidades de ser los índices de en . Esto implica la posibilidad de que esté en igual a siempre que .m{1,2,…,t}xs(t)x(i), 1≤i<t,s(t)m/tt≥m
Al principio solo recopilamos la secuencia hasta que se hayan almacenado elementos. En ese momento solo hay una muestra posible, por lo que la condición de probabilidad se cumple trivialmente.m
El algoritmo se hace cargo cuando . Supongamos inductivamente que es una muestra aleatoria simple de para . Establecer provisionalmente . Sea una variable aleatoria uniforme (independiente de cualquier variable previa utilizada para construir ). Si , reemplace un elemento aleatorio de por . Ese es todo el procedimiento!t=m+1s(t)X(t)t>ms(t+1)=s(t)U(t+1)s(t)U(t+1)≤m/(t+1)sx(t+1)
Claramente, tiene probabilidad de estar en . Además, según la hipótesis de inducción, tenía una probabilidad de estar en cuando . Con probabilidad = se habrá eliminado de , de donde su probabilidad de permanecer igualx(t+1)m/(t+1)s(t+1)x(i)m/ts(t)i≤tm/(t+1)×1/m1/(t+1)s(t+1)
mt(1−1t+1)=mt+1,
exactamente como sea necesario. Por inducción, entonces, todas las probabilidades de inclusión de la en la son correctas y está claro que no hay una correlación especial entre esas inclusiones. Eso prueba que el algoritmo es correcto.x(i)s(t)
La eficiencia del algoritmo es porque en cada etapa se calculan como máximo dos números aleatorios y como máximo se reemplaza un elemento de una matriz de valores . El requisito de almacenamiento es .O(1)mO(m)
La estructura de datos para este algoritmo consiste en la muestra junto con el índice de la población que muestrea. Inicialmente tomamos y procedemos con el algoritmo para Aquí hay una implementación para actualizar con un valor para producir . (El argumento juega el papel de y es . El llamador mantendrá el índice ).stX(t)s=X(m)t=m+1,m+2,….R
(s,t)x(s,t+1)n
tsample.size
mt
update <- function(s, x, n, sample.size) {
if (length(s) < sample.size) {
s <- c(s, x)
} else if (runif(1) <= sample.size / n) {
i <- sample.int(length(s), 1)
s[i] <- x
}
return (s)
}
Para ilustrar y probar esto, usaré el estimador habitual (no robusto) de la media y compararé la media estimada a partir de con la media real de (el conjunto acumulativo de datos visto en cada paso ) Elegí una secuencia de entrada algo difícil que cambia con bastante suavidad pero que periódicamente experimenta saltos dramáticos. El tamaño de la muestra de es bastante pequeño, lo que nos permite ver las fluctuaciones de muestreo en estas parcelas.X ( t ) m = 50s(t)X(t)m=50
n <- 10^3
x <- sapply(1:(7*n), function(t) cos(pi*t/n) + 2*floor((1+t)/n))
n.sample <- 50
s <- x[1:(n.sample-1)]
online <- sapply(n.sample:length(x), function(i) {
s <<- update(s, x[i], i, n.sample)
summary(s)})
actual <- sapply(n.sample:length(x), function(i) summary(x[1:i]))
En este punto online
es la secuencia de estimaciones medias producidas al mantener esta muestra de valores, mientras que es la secuencia de estimaciones medias producidas a partir de todos los datos disponibles en cada momento. El gráfico muestra los datos (en gris), (en negro) y dos aplicaciones independientes de este procedimiento de muestreo (en colores). El acuerdo está dentro del error de muestreo esperado:50actual
actual
plot(x, pch=".", col="Gray")
lines(1:dim(actual)[2], actual["Mean", ])
lines(1:dim(online)[2], online["Mean", ], col="Red")
Para estimadores robustos de la media, busque en nuestro sitio términos atípicos y relacionados. Entre las posibilidades que vale la pena considerar se encuentran las medias Winsorizadas y los estimadores M.