Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Eliminar valores atípicos con el identificador de hampel

En este ejemplo se muestra una implementación ingenua del procedimiento utilizado para detectar y quitar valores atípicos.hampel La función real es mucho más rápida.

Generar una señal aleatoria, , que contiene 24 muestras.x Restablezca el generador de números aleatorios para obtener resultados reproducibles.

rng default  lx = 24; x = randn(1,lx);

Genere una ventana de observación alrededor de cada elemento de .x Tome 2 vecinos a cada lado de la muestra.k La ventana móvil que resulta tiene una longitud de

<math display="block">
<mrow>
<mn>2</mn>
<mo>×</mo>
<mn>2</mn>
<mo>+</mo>
<mn>1</mn>
<mo>=</mo>
<mn>5</mn>
</mrow>
</math>
Muestras.

k = 2;  iLo = (1:lx)-k; iHi = (1:lx)+k;

Truncar la ventana para que la función calcule las medianas de segmentos más pequeños a medida que alcanza los bordes de la señal.

iLo(iLo<1) = 1; iHi(iHi>lx) = lx;

Registre la mediana de cada ventana circundante. Busque la mediana de la desviación absoluta de cada elemento con respecto a la mediana de la ventana.

for j = 1:lx     w = x(iLo(j):iHi(j));     medj = median(w);     mmed(j) = medj;     mmad(j) = median(abs(w-medj)); end

Escalar la desviación absoluta mediana con

<math display="block">
<mrow>
<mrow>
<mfrac>
<mrow>
<mrow>
<mstyle displaystyle="true" scriptlevel="0">
<mrow>
<mn>1</mn>
</mrow>
</mstyle>
</mrow>
</mrow>
<mrow>
<mstyle displaystyle="true" scriptlevel="0">
<mrow>
<msqrt>
<mrow>
<mn>2</mn>
</mrow>
</msqrt>
<mspace width="0.16666666666666666em"></mspace>
<msup>
<mrow>
<mrow>
<mrow>
<mstyle mathvariant="normal">
<mrow>
<mi>e</mi>
<mi>r</mi>
<mi>f</mi>
</mrow>
</mstyle>
</mrow>
</mrow>
</mrow>
<mrow>
<mo>-</mo>
<mn>1</mn>
</mrow>
</msup>
<mo stretchy="false">(</mo>
<mrow>
<mn>1</mn>
<mo>/</mo>
<mn>2</mn>
</mrow>
<mo stretchy="false">)</mo>
</mrow>
</mstyle>
</mrow>
</mfrac>
</mrow>
<mo></mo>
<mn>1</mn>
<mo>.</mo>
<mn>4</mn>
<mn>8</mn>
<mn>2</mn>
<mn>6</mn>
</mrow>
</math>

para obtener una estimación de la desviación estándar de una distribución normal.

sd = mmad/(erfinv(1/2)*sqrt(2));

Encuentre las muestras que difieren de la mediana en más de 2 desviaciones estándar.nd Reemplace cada uno de esos valores atípicos por el valor de la mediana de su ventana circundante. Esta es la esencia del algoritmo Hampel.

nd = 2; ki = abs(x-mmed) > nd*sd;  yu = x; yu(ki) = mmed(ki);

Utilice la función para calcular la señal filtrada y anotar los valores atípicos.hampel Superponga los valores filtrados calculados en este ejemplo.

hampel(x,k,nd)  hold on plot(yu,'o','HandleVisibility','off') hold off

Consulte también