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.

Detección de brotes y cambios significativos en las señales

Este ejemplo muestra cómo determinar cambios o rupturas en señales mediante sumas acumuladas y detección de puntos de cambio.

Detección de brotes mediante sumas acumulativas

Hay muchas aplicaciones prácticas en las que está supervisando los datos y desea recibir alertas cuando el proceso subyacente ha cambiado lo más rápido posible. Una técnica muy popular para lograrlo es por medio de una tabla de control de suma acumulada (CUSUM).

Para ilustrar cómo funciona CUSUM, examine en primer lugar el total de casos notificados del brote de Ebola en África occidental 2014.

Fuente:Centros para el control y la prevención de enfermedades

load WestAfricanEbolaOutbreak2014 plot(WHOreportdate, [TotalCasesGuinea TotalCasesLiberia TotalCasesSierraLeone],'.-') legend('Guinea','Liberia','Sierra Leone'); title('Total suspected, probable and confirmed cases of Ebola virus disease');

Si nos fijamos en la vanguardia del primer brote en Guinea, se puede ver que los primeros cien casos fueron reportados alrededor 25 de marzo, 2014, y aumentar significativamente después de esa fecha. Lo que es interesante notar es que, si bien Liberia también tuvo algunos casos sospechosos en marzo, el número de casos permaneció relativamente bajo control hasta unos treinta días después.

Para obtener una idea de la tasa entrante de los nuevos pacientes, trazar los cambios relativos día a día en el número total de casos, comenzando desde el inicio el 25 de marzo de 2015.

daysSinceOutbreak = datetime(2014, 3, 24+(0:400)); cases = interp1(WHOreportdate, TotalCasesLiberia, daysSinceOutbreak); dayOverDayCases = diff(cases);  plot(dayOverDayCases) title('Rate of new cases (per diem) in Liberia since March 25, 2014'); ylabel('Change in number of reported cases per diem'); xlabel('Number of days since outbreak began');

Si amplía los primeros cien días de datos, puede ver que, aunque hubo una afluencia inicial de casos, muchos de ellos se descartaron después del día 30, donde la tasa de cambios cayó por debajo de cero temporalmente. También verá una tendencia ascendente significativa entre los días 95 y 100, donde se alcanzó una tasa de siete nuevos casos por día.

xlim([1 101])

Realizar una prueba de CUSUM en los datos de entrada puede ser una forma rápida de determinar cuándo se produce un brote. CUSUM realiza un seguimiento de dos sumas acumulativas: una suma superior que detecta cuando la media local cambia hacia arriba y una suma menor que detecta cuando la media cambia a la baja. La técnica de integración proporciona a CUSUM la capacidad de ignorar un pico grande (transitorio) en la tasa entrante, pero todavía tiene sensibilidad para que los pequeños cambios de velocidad sean más estables.

Al llamar a CUSUM con argumentos predeterminados se inspeccionarán los datos de las primeras veinticinco muestras y se alarmará cuando se encuentre un cambio en la media de más de cinco desviaciones estándar desde dentro de los datos iniciales.

cusum(dayOverDayCases(1:101)) legend('Upper sum','Lower sum')

Tenga en cuenta que CUSUM capturó los casos falsos reportados en el día 30 (en el día 33) y recogió el inicio inicial del brote a partir del día 80 (en el día 90). Si compara estos resultados cuidadosamente con la trama anterior, puede ver que CUSUM fue capaz de ignorar el repunte espurio en el día 29, pero todavía desencadenar una alarma cinco días antes de la gran tendencia ascendente a partir del día 95.

Si ajusta CUSUM para que tenga una media objetivo de cero casos/día con un objetivo de más o menos tres casos/día, puede ignorar la falsa alarma en el día 30 y recoger el brote en el día 92:

climit = 5; mshift = 1; tmean = 0; tdev = 3; cusum(dayOverDayCases(1:100),climit,mshift,tmean,tdev)

Encontrar un cambio significativo en la varianza

Otro método para detectar cambios bruscos en las estadísticas es a través de la detección de puntos de cambio, que divide una señal en segmentos adyacentes donde una estadística (por ejemplo, media, varianza, pendiente, etc.) es constante dentro de cada segmento.

El siguiente ejemplo analiza el nivel anual mínimo de agua del río Nilo para los años 622 a 1281 AD medido en el medidor Roda cerca de el Cairo.

load nilometer years = 622:1284; plot(years,nileriverminima) title('Yearly Minimum level of Nile River') xlabel('Year') ylabel('Level (m)')

La construcción comenzó en un dispositivo de medición más nuevo y más preciso alrededor de 715 AD. No se sabe mucho antes de este tiempo, pero en el examen adicional, se puede ver que hay considerablemente menos variabilidad después de alrededor de 722. Para encontrar el período de tiempo en el que el nuevo dispositivo se puso en funcionamiento, puede buscar el mejor cambio en el nivel de agua de la media cuadrada después de realizar la diferenciación de elementos para eliminar cualquier tendencia que varía lentamente.

i = findchangepts(diff(nileriverminima),'Statistic','rms');  ax = gca; xp = [years(i) ax.XLim([2 2]) years(i)]; yp = ax.YLim([1 1 2 2]); patch(datenum(xp),yp,[.5 .5 .5],'facealpha',0.1);

Mientras que la diferenciación de muestreo es un método simple para eliminar tendencias, hay otros métodos más sofisticados para examinar la varianza en escalas más grandes. Para obtener un ejemplo de cómo realizar la detección de puntos de cambio mediante wavelets mediante este conjunto de datos, consulte.Wavelet Changepoint Detection (Wavelet Toolbox)

Detección de varios cambios en una señal de entrada

El siguiente ejemplo se refiere a una simulación de 45 segundos de un bloque de transmisión CR-CR de 4 velocidades, muestreado a intervalos de 1 ms. A continuación se muestran los datos de simulación de las RPM del motor del coche y el par.

load simcarsig  subplot(2,1,2); plot(carTorqueNM); xlabel('Samples'); ylabel('Torque (N m)'); title('Torque');  subplot(2,1,1); plot(carEngineRPM); xlabel('Samples'); ylabel('Speed (RPM)'); title('Engine Speed');

Aquí el coche se acelera, cambia los engranajes tres veces, cambia a neutro, y luego aplica el freno.

Dado que la velocidad del motor se puede modelar naturalmente como una serie de segmentos lineales, puede utilizar para encontrar las muestras donde el coche cambia de marchas.findchangepts

figure findchangepts(carEngineRPM,'Statistic','linear','MaxNumChanges',4) xlabel('Samples'); ylabel('Engine speed (RPM)');

Aquí puede ver cuatro cambios (entre cinco segmentos lineales) y que ocurrieron alrededor de la marca de muestra 10.000, 20.000, 30.000 y 40.000. Acerque la porción inactiva de la forma de onda:

xlim([18000 22000])

Tenga en cuenta que el ajuste de línea recta rastrea de cerca la forma de onda de entrada, sin embargo se puede mejorar.

Observar los cambios de un evento multietapa compartido entre señales

Para ver la mejora, aumente el número de puntos de cambio a 20 y observe los cambios en la vecindad del cambio de marchas en el número de muestra 19000

findchangepts(carEngineRPM,'Statistic','linear','MaxNumChanges',20) xlim([18000 22000])

Observe que la velocidad del motor comenzó a disminuir en la muestra 19035 y tomó 510 muestras antes de que se asentara en la muestra 19550. Dado que el intervalo de muestreo es de 1 MS, este es un retardo de ~ 0,51 s y es una cantidad típica de tiempo después de cambiar de marchas.

Ahora mira los puntos de cambio del par motor dentro de la misma región:

findchangepts(carTorqueNM,'Statistic','Linear','MaxNumChanges',20) xlim([19000 20000])

Observe que el par del motor se entregó completamente al eje en la muestra 19605, 55 milisegundos después de que la velocidad del motor terminara de asentarse. Este tiempo está relacionado con el retardo entre la carrera de admisión del motor y la producción de par.

Para encontrar cuando el embrague se comprometió se puede acercar más a la señal.

xlim([19000 19050])

El embrague estaba deprimido en la muestra 19011 y tomó alrededor de 30 muestras (milisegundos) para quedar completamente desocupado.