Friday 4 November 2016

Código Matlab Medio Móvil Simple


Utilizando MATLAB, cómo puedo encontrar el promedio móvil de 3 días de una columna específica de una matriz y añadir el promedio móvil a esa matriz? Estoy tratando de calcular el promedio móvil de 3 días de abajo hacia arriba de la matriz. He proporcionado mi código: Dada la siguiente matriz a y máscara: He intentado implementar el comando conv pero estoy recibiendo un error. Aquí está el comando conv que he estado tratando de usar en la segunda columna de la matriz a: La salida que deseo se da en la siguiente matriz: Si usted tiene alguna sugerencia, lo agradecería mucho. Gracias Por la columna 2 de la matriz a, estoy calculando el promedio móvil de 3 días de la siguiente manera y colocando el resultado en la columna 4 de la matriz a (I renombrado matriz a como 39desiredOutput39 sólo por ilustración). El promedio de 3 días de 17, 14, 11 es 14 el promedio de 3 días de 14, 11, 8 es 11 el promedio de 3 días de 11, 8, 5 es 8 y el promedio de 3 días de 8, 5, 2 es 5. No hay valor en las 2 filas inferiores para la cuarta columna porque el cálculo para la media móvil de 3 días comienza en la parte inferior. La salida 39valid39 no se mostrará hasta al menos 17, 14 y 11. Esperamos que esto tiene sentido ndash Aaron Jun 12 13 at 1:28 1 Respuesta En general, sería de ayuda si se muestra el error. En este caso usted está haciendo dos cosas mal: Primero su convolución necesita ser dividido por tres (o la longitud de la media móvil) Segundo, observe el tamaño de c. Usted no puede apenas caber c en a. La forma típica de obtener un promedio móvil sería usar lo mismo: pero eso no se parece a lo que quieres. En cambio, se ve obligado a usar un par de líneas: Tengo una matriz de datos de series de tiempo para 8 variables con alrededor de 2500 puntos (10 años de lunes a viernes) y me gustaría calcular la media, la varianza, asimetría y curtosis en un movimiento Base media Digamos cuadros 100 252 504 756 - Quisiera calcular las cuatro funciones arriba sobre sobre cada uno de los (tiempo-) cuadros, sobre una base diaria - así que la vuelta para el día 300 en el caso con el 100 marco del día, sería media Kurtosis de desviación de desviación del período day201-day300 (100 días en total). y así. Sé que esto significa que obtendría una salida de matriz, y el número de la primera trama de días sería NaNs, pero no puedo encontrar la indexación necesaria para hacer esto. Esta es una pregunta interesante porque creo que la solución óptima es diferente para la media que para las otras estadísticas de la muestra. He proporcionado un ejemplo de simulación a continuación que puede trabajar a través de. Primero, elija algunos parámetros arbitrarios y simule algunos datos: Para la media, use el filtro para obtener un promedio móvil: Originalmente pensé resolver este problema usando conv como sigue: Pero como PhilGoddard señaló en los comentarios, el enfoque de filtro evita la Necesidad del bucle. También tenga en cuenta que Ive elegido para hacer las fechas en la matriz de salida corresponden a las fechas en X para que en el trabajo posterior se puede utilizar los mismos subíndices para ambos. Así, las primeras observaciones de WindowLength-1 en MeanMA serán nan. Para la varianza, no puedo ver cómo utilizar filtro o conv o incluso una suma de ejecución para hacer las cosas más eficientes, por lo que en su lugar realizar el cálculo manualmente en cada iteración: Podemos acelerar ligeramente las cosas mediante la explotación del hecho de que ya hemos Calculó la media móvil media. Simplemente reemplace la línea de bucle dentro de lo anterior con: Sin embargo, dudo que esto haga mucha diferencia. Si alguien más puede ver una manera inteligente de usar filtro o conv para obtener la variación de la ventana móvil Id estar muy interesado en verlo. Dejo el caso de skewness y kurtosis al OP, ya que son esencialmente igual que el ejemplo de la varianza, pero con la función apropiada. Un último punto: si estuviera convirtiendo lo anterior en una función general, podría pasar una función anónima como uno de los argumentos, entonces tendría una rutina de promedio móvil que funciona para la elección arbitraria de las transformaciones. Final, punto final: Para una secuencia de longitudes de ventana, simplemente haga un bucle sobre el bloque de código completo para cada longitud de ventana. Sí, la función de filtro es realmente mejor para la media - pero yo quería hacer esto para varias funciones diferentes, no sólo la media. Acabo de publicar mi respuesta porque funcionó para mí y pensé que podría ayudar a alguien más. Ndash Dexter Morgan Apr 15 14 a las 12: 40Descargar movAv. m (ver también movAv2 - una versión actualizada que permite la ponderación) Descripción Matlab incluye funciones llamadas movavg y tsmovavg (series de tiempo de movimiento promedio) en la caja de herramientas financiera, movAv está diseñado para replicar el Funcionalidad básica de estos. El código aquí proporciona un buen ejemplo de gestión de índices dentro de bucles, lo que puede ser confuso para empezar. Ive deliberadamente mantenido el código corto y simple para mantener este proceso claro. MovAv realiza una media móvil simple que se puede utilizar para recuperar datos ruidosos en algunas situaciones. Funciona tomando la media de la entrada (y) sobre una ventana de tiempo de deslizamiento, cuyo tamaño está especificado por n. Cuanto mayor es n, mayor es la cantidad de suavizado que el efecto de n es relativo a la longitud del vector de entrada y. Y efectivamente (bueno, una especie de) crea un filtro de frecuencia de paso bajo - vea la sección de ejemplos y consideraciones. Debido a que la cantidad de suavizado proporcionada por cada valor de n es relativa a la longitud del vector de entrada, siempre vale la pena probar diferentes valores para ver cuál es apropiado. Recuerde también que n puntos se pierden en cada promedio si n es 100, los primeros 99 puntos del vector de entrada no contienen suficientes datos para un promedio de 100 puntos. Esto puede evitarse de alguna manera mediante el apilamiento de promedios, por ejemplo, el código y el gráfico de abajo comparan varios promedios de ventana de longitud diferentes. Observe cómo el 1010pt liso es comparado a un solo promedio 20pt. En ambos casos se pierden 20 puntos de datos en total. Crear xaxis x1: 0.01: 5 Generar ruido noiseReps 4 ruido repmat (randn (1, ceil (numel (x) / noiseReps)), noiseReps, 1) (X) 10noise (1: length (x)) Medias de Perfrom: y2 movAv (y, 10) 10 pt y3 movAv (y2, 10) 1010 pt y4 movAv (y, 20) 20 pt y5 movAv (y, 40) 40 (X, y, y2, y3, y4, y5, y6) leyenda (datos sin procesar, 10pt media móvil, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel (Y) title (Comparación de promedios móviles) movAv. m función de ejecución del programa movAv (y, n) La primera línea define el nombre de las funciones, entradas y salidas. La entrada x debe ser un vector de datos para realizar el promedio en, n debe ser el número de puntos para realizar el promedio sobre la salida contendrá los datos promediados devueltos por la función. Prealocar la salida outputNaN (1, numel (y)) Encontrar el punto medio de n midPoint round (n / 2) El trabajo principal de la función se realiza en el bucle for, pero antes de comenzar se preparan dos cosas. En primer lugar la salida se pre-asignó como NaNs, esto sirvió dos propósitos. En primer lugar, la prealocación es generalmente una buena práctica ya que reduce la memoria que hace malabarismos Matlab tiene que hacer, en segundo lugar, hace que sea muy fácil colocar los datos promediados en una salida del mismo tamaño que el vector de entrada. Esto significa que el mismo xaxis se puede usar más adelante para ambos, lo cual es conveniente para trazar, alternativamente los NaNs pueden ser removidos más adelante en una línea de código (output output) (La variable midPoint será usada para alinear los datos en el vector de salida. N 10, se perderán 10 puntos porque, para los primeros 9 puntos del vector de entrada, no hay suficientes datos para tomar un promedio de 10. Como la salida será más corta que la entrada, debe alinearse correctamente. Se utiliza para que se pierda una cantidad igual de datos al inicio y al final y la entrada se mantenga alineada con la salida por los tampones NaN creados al asignar previamente la salida para un rango de 1: length (y) - n Find index para tomar el promedio (A: b) ban Calcula la media de salida (amidPoint) media (y (a: b)) end En el bucle for sí mismo, se toma una media sobre cada segmento consecutivo de la entrada. Definido como 1 hasta la longitud de la entrada (y), menos los datos que se perderán (n) Si la entrada tiene 100 puntos de largo y n es 10, el bucle se ejecutará desde (a) 1 hasta 90. Esto Significa a proporciona el primer índice del segmento a promediar. El segundo índice (b) es simplemente un-1. Así que en la primera iteración, a1. N10. Así que b 11-1 10. El primer promedio se toma sobre y (a: b). O x (1:10). El promedio de este segmento, que es un valor único, se almacena en la salida en el índice amidPoint. O 156. En la segunda iteración, a2. B 210-1 11. Así que la media se toma sobre x (2:11) y se almacena en la salida (7). En la última iteración del bucle para una entrada de longitud 100, a91. B 9010-1 100 de modo que la media se toma en x (91: 100) y se almacena en la salida (95). Esto deja salida con un total de n (10) valores de NaN en el índice (1: 5) y (96: 100). Ejemplos y consideraciones Las medias móviles son útiles en algunas situaciones, pero no siempre son la mejor opción. Aquí hay dos ejemplos donde theyre no necesariamente óptimo. Calibración de micrófono Este conjunto de datos representa los niveles de cada frecuencia producida por un altavoz y grabada por un micrófono con una respuesta lineal conocida. La salida del altavoz varía con la frecuencia, pero podemos corregir esta variación con los datos de calibración - la salida se puede ajustar en el nivel para tener en cuenta las fluctuaciones en la calibración. Observe que los datos brutos son ruidosos - esto significa que un pequeño cambio en la frecuencia parece requerir un cambio grande, errático, en el nivel a tener en cuenta. Es esto realista o es esto un producto del entorno de grabación Es razonable en este caso aplicar una media móvil que suaviza la curva de nivel / frecuencia para proporcionar una curva de calibración que es ligeramente menos errática. Pero por qué no es esto óptimo en este ejemplo? Más datos serían mejores - múltiples calibraciones se promediarían juntos destruirían el ruido en el sistema (siempre y cuando sea aleatorio) y proporcionarían una curva con menos detalles sutiles perdidos. El promedio móvil sólo puede aproximarse a esto, y puede quitar algunos suelos y picos de frecuencia más alta de la curva que realmente existen. Las ondas sinusoidales El uso de un promedio móvil en las ondas sinusoidales destaca dos puntos: La cuestión general de elegir un número razonable de puntos para realizar el promedio. Su simple, pero hay métodos más eficaces de análisis de señales que el promedio de las señales oscilantes en el dominio del tiempo. En este gráfico, la onda sinusoidal original se representa en azul. Se añade ruido y se representa como la curva naranja. Un promedio móvil se realiza en números diferentes de puntos para ver si la onda original puede ser recuperada. 5 y 10 puntos proporcionan resultados razonables, pero no eliminan el ruido por completo, cuando un mayor número de puntos comienzan a perder detalle de amplitud como el promedio se extiende en diferentes fases (recuerde que la onda oscila alrededor de cero y media (-1 1) 0) . Un enfoque alternativo sería construir un filtro de paso bajo que se pueda aplicar a la señal en el dominio de la frecuencia. No voy a entrar en detalles ya que va más allá del alcance de este artículo, pero como el ruido es considerablemente más alta frecuencia que la frecuencia fundamental de las ondas, sería bastante fácil en este caso para construir un filtro de paso bajo que eliminará la frecuencia alta ruido.

No comments:

Post a Comment