Main Content

hampel

Eliminar valores atípicos con un identificador Hampel

Descripción

ejemplo

y = hampel(x) aplica un filtro de Hampel al vector de entrada x para detectar y eliminar valores atípicos. Para cada muestra de x, la función calcula la mediana de una ventana compuesta por la muestra y sus seis muestras circundantes, tres por lado. También estima la desviación estándar de cada muestra en torno a la mediana de su ventana mediante la desviación absoluta media. Si una muestra difiere de la mediana en más de tres desviaciones estándar, se sustituye por la mediana. Si x es una matriz, la función trata cada columna de x como un canal independiente.

y = hampel(x,k) especifica el número de vecinos k a cada lado de cada muestra de x en la ventana de medición. k tiene un valor predeterminado de 3.

ejemplo

y = hampel(x,k,nsigma) especifica un número de desviaciones estándar nsigma por el que una muestra de x debe diferir de la mediana local para que se sustituya por la mediana. nsigma tiene un valor predeterminado de 3.

ejemplo

[y,j] = hampel(___) también devuelve una matriz lógica que es verdadera en las ubicaciones de todos los puntos identificados como atípicos. Esta sintaxis acepta cualquiera de los argumentos de entrada de las sintaxis anteriores.

ejemplo

[y,j,xmedian,xsigma] = hampel(___) también devuelve las medianas locales y las desviaciones estándar estimadas para cada elemento de x.

hampel(___) sin argumentos de salida representa la señal filtrada y anota los valores atípicos que se han eliminado.

Ejemplos

contraer todo

Genere 100 muestras de una señal sinusoidal. Sustituya las muestras sexta y vigésima por picos.

x = sin(2*pi*(0:99)/100);
x(6) = 2;
x(20) = -2;

Utilice hampel para localizar cada muestra que difiera en más de tres desviaciones estándar de la mediana local. La ventana de medición está compuesta por la muestra y sus seis muestras circundantes, tres por lado.

[y,i,xmedian,xsigma] = hampel(x);

Represente la señal filtrada y anote los valores atípicos.

n = 1:length(x);
plot(n,x)
hold on
plot(n,xmedian-3*xsigma,n,xmedian+3*xsigma)
plot(find(i),x(i),'sk')
hold off
legend('Original signal','Lower limit','Upper limit','Outliers')

Figure contains an axes object. The axes object contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Original signal, Lower limit, Upper limit, Outliers.

Repita el cálculo, pero ahora tome solo una muestra adyacente en cada lado cuando calcule la mediana. La función considera los extremos como valores atípicos.

hampel(x,1)

Figure contains an axes object. The axes object contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent original signal, filtered signal, outliers.

Genere una señal de dos canales compuesta de sinusoides de diferentes frecuencias. Coloque picos en lugares aleatorios. Utilice NaN para añadir muestras faltantes de forma aleatoria. Reinicie el generador de números aleatorios para obtener resultados reproducibles. Represente la señal.

rng('default')

n = 59;
x = sin(pi./[15 10]'*(1:n)+pi/3)';

spk = randi(2*n,9,1);
x(spk) = x(spk)*2;
x(randi(2*n,6,1)) = NaN;

plot(x)

Figure contains an axes object. The axes object contains 2 objects of type line.

Filtre la señal utilizando hampel con los valores predeterminados.

y = hampel(x);
plot(y)

Figure contains an axes object. The axes object contains 2 objects of type line.

Aumente la longitud de la ventana variable y reduzca el umbral para tratar una muestra como valor atípico.

y = hampel(x,4,2);
plot(y)

Figure contains an axes object. The axes object contains 2 objects of type line.

Obtenga como salida la mediana en curso para cada canal. Superponga las medianas en una gráfica de la señal.

[y,j,xmd,xsd] = hampel(x,4,2);
plot(x)
hold on
plot(xmd,'--')

Figure contains an axes object. The axes object contains 4 objects of type line.

Genere una señal multicanal compuesta por dos sinusoides de distintas frecuencias integradas en ruido blanco gaussiano de varianza unitaria.

rng('default')

t = 0:60;
x = sin(pi./[10;2]*t)'+randn(numel(t),2);

Aplique un filtro de Hampel a la señal. Tome como valores atípicos aquellos puntos que difieren en más de dos desviaciones estándar de la mediana de una ventana de nueve muestras circundante. Obtenga como salida una matriz lógica que sea verdadera en las ubicaciones de los valores atípicos.

k = 4;
nsig = 2;

[y,h] = hampel(x,k,nsig);

Represente cada canal de la señal en su propio conjunto de ejes. Trace la señal original, la señal filtrada y los valores atípicos. Anote las ubicaciones de los valores atípicos.

for k = 1:2
    hk = h(:,k);
    ax = subplot(2,1,k);
    plot(t,x(:,k))
    hold on
    plot(t,y(:,k))
    plot(t(hk),x(hk,k),'*')
    hold off
    ax.XTick = t(hk);
end

Figure contains 2 axes objects. Axes object 1 contains 3 objects of type line. One or more of the lines displays its values using only markers Axes object 2 contains 3 objects of type line. One or more of the lines displays its values using only markers

Genere 100 muestras de una señal sinusoidal. Sustituya las muestras sexta y vigésima por picos.

n = 1:100;
x = sin(2*pi*n/100);
x(6) = 2;
x(20) = -2;

Utilice hampel para calcular la mediana local y la desviación estándar estimada para cada muestra. Utilice los valores predeterminados de los parámetros de entrada:

  • El tamaño de la ventana es 2×3+1=7.

  • Los puntos que difieren de la mediana de su ventana en más de tres desviaciones estándar se consideran valores atípicos.

Represente el resultado.

[y,i,xmedian,xsigma] = hampel(x);

plot(n,x)
hold on
plot(n,[1;1]*xmedian+3*[-1;1]*xsigma)
plot(find(i),x(i),'sk')
hold off
legend('Signal','Lower','Upper','Outliers')

Figure contains an axes object. The axes object contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Signal, Lower, Upper, Outliers.

Repita el cálculo con un tamaño de ventana de 2×10+1=21 y dos desviaciones estándar como criterios para identificar los valores atípicos.

sds = 2;
adj = 10;
[y,i,xmedian,xsigma] = hampel(x,adj,sds);

plot(n,x)
hold on
plot(n,[1;1]*xmedian+sds*[-1;1]*xsigma)
plot(find(i),x(i),'sk')
hold off
legend('Signal','Lower','Upper','Outliers')

Figure contains an axes object. The axes object contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Signal, Lower, Upper, Outliers.

Argumentos de entrada

contraer todo

Señal de entrada, especificada como vector o matriz. Si x es una matriz, hampel trata cada columna de x como un canal independiente.

Ejemplo: cos(pi/4*(0:159))+randn(1,160) es una señal de vector fila monocanal.

Ejemplo: cos(pi./[4;2]*(0:159))'+randn(160,2) es una señal de dos canales.

Tipos de datos: single | double

Número de vecinos a cada lado de la muestra xs, especificado como escalar entero. Las muestras cercanas a los bordes de la señal que tienen menos de k muestras en un lado se comparan con la mediana de una ventana más pequeña.

Tipos de datos: single | double

Número de desviaciones estándar en las que una muestra de x debe diferir de su mediana local para que sea considerada un valor atípico. Especifique nsigma como un escalar real. La función estima la desviación estándar escalando la desviación absoluta media (MAD) local por un factor de κ=12erf1(1/2)1.4826.

Tipos de datos: single | double

Argumentos de salida

contraer todo

Señal filtrada, devuelta como vector o matriz del mismo tamaño que x.

Tipos de datos: single | double

Índice de valores atípicos, devuelto como vector o matriz del mismo tamaño que x.

Tipos de datos: logical

Medianas locales, devueltas como vector o matriz del mismo tamaño que x.

Tipos de datos: single | double

Desviaciones estándar estimadas, devueltas como vector o matriz del mismo tamaño que x.

Tipos de datos: single | double

Más acerca de

contraer todo

Identificador de Hampel

El identificador de Hampel es una variación de la regla de tres sigmas en estadística que es sólida frente a los valores atípicos.

Dada una secuencia x1, x2, x3, …, xn y una ventana deslizante de longitud k, defina las estimaciones de la mediana y la desviación estándar punto a punto mediante:

  • Mediana local — mi=median(xik,xik+1,xik+2,,xi,,xi+k2,xi+k1,xi+k)

  • Desviación estándar — σi=κmedian(|xikmi|,,|xi+kmi|), donde κ=12erf1(1/2)1.4826

La cantidad σi /κ se conoce como desviación absoluta media (MAD).

Si una muestra xi es tal que

|ximi|>nσσi

para un umbral dado nσ, el identificador de Hampel declara xi como un valor atípico y lo sustituye por mi.

Cerca de los puntos finales de la secuencia, la función trunca la ventana utilizada para calcular mi y σi:

  • i < k + 1

    mi=median(x1,x2,x3,,xi,,xi+k2,xi+k1,xi+k)

    σi=κmedian(|x1m1|,,|xi+kmi|)

  • i > nk

    mi=median(xik,xik+1,xik+2,,xi,,xn2,xn1,xn)

    σi=κmedian(|xikmi|,,|xnmn|)

Referencias

[1] Liu, Hancong, Sirish Shah, and Wei Jiang. “On-line outlier detection and data cleaning.” Computers and Chemical Engineering. Vol. 28, March 2004, pp. 1635–1647.

Capacidades ampliadas

Historial de versiones

Introducido en R2015b

Consulte también

| | | | | (Statistics and Machine Learning Toolbox) | | |