Wednesday 15 November 2017

Moving Average Using Proc Expand


Im un principiante del SAS y Im curioso si la tarea siguiente se puede hacer mucho más simple pues está actualmente en mi cabeza. Tengo los siguientes metadatos (simplificados) en una tabla llamada userdatemoney: Usuario - Fecha - Dinero con varios usuarios y fechas para cada día calendario (durante los últimos 4 años). Los datos son ordenados por el usuario ASC y fecha ASC, datos de ejemplo se ve así: Ahora quiero calcular un promedio móvil de cinco días para el dinero. Comencé con el apprach bastante popular con la función lag () como esto: como ves, el problema con este método se produce si hay si el paso de datos se ejecuta en un nuevo usuario. Aron obtendría algunos valores rezagados de Anna, que por supuesto no debería suceder. Ahora mi pregunta: Estoy bastante seguro de que puede manejar el cambio de usuario mediante la adición de algunos campos adicionales como laggeduser y restablecer las variables N, Suma y Media si se nota un cambio, pero: ¿Puede hacerse esto de una manera más fácil Tal vez utilizando el Por Cláusula de cualquier manera Gracias por tus ideas y ayuda Creo que la manera más fácil es usar PROC EXPAND: Y como se mencionó en el comentario de Johns, es importante recordar acerca de los valores perdidos (y sobre las observaciones de principio y fin). He añadido la opción SETMISS al código, ya que dejó claro que desea poner a cero los valores faltantes, no ignorarlos (comportamiento predeterminado MOVAVE). Y si desea excluir las primeras 4 observaciones para cada usuario (ya que no tienen suficiente antecedente para calcular el promedio móvil 5), puede utilizar la opción TRIMLEFT 4 dentro de TRANSFORMOUT (). Respondió Dec 3 13 at 15: 29Desenvío en la versión 6.08 del sistema SAS, PROC EXPAND en el software SAS / ETS se puede utilizar para realizar una variedad de transformaciones de datos. Estas transformaciones incluyen: derivaciones, desfases, medias móviles ponderadas y no ponderadas, sumas en movimiento y sumas acumuladas, por nombrar algunas. Muchas nuevas transformaciones fueron agregadas en la Versión 6.12, incluyendo especificaciones separadas para los promedios móviles centrados y hacia atrás. Estas nuevas transformaciones hicieron necesario modificar la sintaxis de algunas de las transformaciones soportadas antes de la Versión 6.12. A continuación se proporcionan ejemplos de cómo especificar la sintaxis para los promedios móviles centrados y hacia atrás utilizando la versión 6.11 y anterior y la versión 6.12 y posterior. PROC EXPAND puede calcular una media móvil centrada o una media móvil hacia atrás. Una media móvil centrada en 5 periodos se calcula promediando un total de 5 valores consecutivos de la serie (el valor del período actual además de los dos valores inmediatamente anteriores y dos valores inmediatamente siguientes al valor actual). Un promedio móvil de retroceso de 5 periodos se calcula promediando el valor del periodo actual con los valores de los 4 períodos inmediatamente anteriores. La siguiente sintaxis ilustra cómo utilizar la especificación TRANSFORM (MOVAVE n) para calcular una media móvil centrada en 5 periodos usando la Versión 6.11 o anterior: Para calcular un promedio móvil de retroceso de n periodos utilizando la Versión 6.11 o anterior, utilice TRANSFORM (MOVAVE) N LAG k) especificación, donde k (n-1) / 2 si n es impar o donde k (n-2) / 2 si n es par. La siguiente sintaxis ilustra cómo utilizar la especificación TRANSFORM (CMOVAVE n) para calcular una media móvil centrada en 5 periodos usando la Versión 6.12 o Más adelante: La siguiente sintaxis similar ilustra cómo utilizar la especificación TRANSFORM (MOVAVE n) para calcular un promedio móvil hacia atrás de 5 periodos utilizando la Versión 6.12 o posterior: Para obtener más información, vea Operaciones de Transformación en el capítulo EXPAND de la Guía de Usuarios de SAS / ETS . Si no tiene acceso a SAS / ETS, puede calcular una media móvil en el paso DATA tal como se ilustra en este programa de ejemplo. Información del sistema operativo y de la versión Las operaciones que se pueden utilizar en las opciones TRANSFORMIN y TRANSFORMOUT se muestran en la Tabla 14.1. Las operaciones se aplican a cada valor de la serie. Cada valor de la serie se sustituye por el resultado de la operación. En la Tabla 14.1. O x representa el valor de la serie en un período de tiempo determinado t antes de aplicar la transformación, representa el valor de la serie de resultados y N representa el número total de observaciones. La notación n indica que el argumento n es opcional, el valor predeterminado es 1. La ventana de notación se utiliza como argumento para los operadores de estadísticas en movimiento e indica que puede especificar un número entero de períodos n o una lista de n pesos en Paréntesis La secuencia de notación se utiliza como argumento para los operadores de secuencia, e indica que debe especificar una secuencia de números. La notación s indica la longitud de la estacionalidad, y es un argumento requerido. Tabla 14.1 Operaciones de transformación Operadores de ventana de tiempo móvil Algunos operadores calculan estadísticas para un conjunto de valores dentro de una ventana de tiempo móvil, a los que se llaman operadores de ventanas de tiempo móvil. Hay versiones centradas y hacia atrás de estos operadores. Los operadores de ventanas de tiempo de movimiento en movimiento son CMOVAVE, CMOVCSS, CMOVGMEAN, CMOVMAX, CMOVMED, CMOVMIN, CMOVPROD, CMOVRANGE, CMOVRANK, CMOVSTD, CMOVSUM, CMOVTVALUE, CMOVUSS y CMOVVAR. Estos operadores calculan estadísticas de los valores de las observaciones. Los operadores de ventanas de tiempo de movimiento hacia atrás son MOVAVE, MOVCSS, MOVGMEAN, MOVMAX, MOVMED, MOVMIN, MOVPROD, MOVRANGE, MOVRANK, MOVSTD, MOVSUM, MOVTVALUE, MOVUSS y MOVVAR. Estos operadores calculan estadísticas de los valores. Todos los operadores de ventana de tiempo en movimiento aceptan un argumento que especifica el número de períodos a incluir en la ventana de tiempo. Por ejemplo, la siguiente sentencia calcula una media móvil hacia atrás de cinco períodos de X. En este ejemplo, la transformación resultante es La siguiente sentencia calcula una media móvil centrada en cinco periodos de X. En este ejemplo, la transformación resultante es Si la ventana con un operador de ventana de tiempo móvil en movimiento no es un número impar, se incluye un valor más retrasado que el valor de avance en la ventana de tiempo. Por ejemplo, el resultado del operador CMOVAVE 4 puede calcular una operación de ventana de tiempo de movimiento hacia adelante combinando un operador de ventana de tiempo de movimiento hacia atrás con el operador REVERSE. Por ejemplo, la siguiente sentencia calcula un promedio móvil de X de cinco periodos. En este ejemplo, la transformación resultante es Algunos de los operadores de ventana de tiempo de movimiento le permiten especificar una lista de valores de peso para calcular estadísticas ponderadas. Estos son CMOVAVE, CMOVCSS, CMOVGMEAN, CMOVPROD, CMOVSTD, CMOVTVALUE, CMOVUSS, CMOVVAR, MOVAVE, MOVCSS, MOVGMEAN, MOVPROD, MOVSTD, MOVTVALUE, MOVUSS y MOVVAR. Para especificar un operador de ventana de tiempo de movimiento ponderado, introduzca los valores de peso entre paréntesis después del nombre del operador. El ancho de ventana es igual al número de pesos que especifique que no especifique. Por ejemplo, la siguiente sentencia calcula un promedio móvil ponderado de cinco periodos de X. En este ejemplo, la transformación resultante es Los valores de peso deben ser mayores que cero. Si los pesos no suman 1, los pesos especificados se dividen por su suma para producir los pesos utilizados para calcular la estadística. Una ventana de tiempo completa no está disponible al principio de la serie. Para los operadores centrados, una ventana completa tampoco está disponible al final de la serie. El cálculo de los operadores de ventana de tiempo móvil se ajusta para estas condiciones de contorno como sigue. Para los operadores de ventanas que se mueven hacia atrás, el ancho de la ventana de tiempo se acorta al principio de la serie. Por ejemplo, los resultados del operador MOVSUM 3 son valores perdidos Puede truncar la longitud de la serie de resultados utilizando los operadores TRIM, TRIMLEFT y TRIMRIGHT para establecer valores que faltan al principio o al final de la serie. Puede utilizar estas funciones para recortar los resultados de los operadores de ventana de tiempo en movimiento de modo que la serie de resultados contenga sólo valores calculados desde una ventana de tiempo de ancho completo. Por ejemplo, las siguientes afirmaciones calculan una media móvil centrada de cinco periodos de X. Y establecen valores faltantes en los extremos de la serie que son promedios de menos de cinco valores. Normalmente, la ventana de tiempo móvil y los operadores de estadísticas acumuladas ignoran los valores faltantes y calculan sus resultados para los valores no perdidos. Cuando precedido por el operador NOMISS, estas funciones producen un resultado faltante si no hay ningún valor dentro de la ventana de tiempo. El operador NOMISS no realiza cálculos, sino que sirve para modificar el funcionamiento del operador de la ventana de tiempo móvil que lo sigue. El operador NOMISS no tiene efecto a menos que sea seguido por un operador de ventana de tiempo móvil. Por ejemplo, la siguiente sentencia calcula una media móvil de cinco períodos de la variable X pero produce un valor faltante cuando falta cualquiera de los cinco valores. La sentencia siguiente calcula la suma acumulada de la variable X pero produce un valor faltante para todos los períodos después del primer valor X faltante. Similar al operador NOMISS, el operador MISSONLY no realiza cálculos (a menos que sea seguido por la opción MEAN), pero sirve para modificar la operación del operador de la ventana de tiempo móvil que la sigue. Cuando se precede por el operador MISSONLY, estos operadores de ventanas de tiempo de movimiento reemplazan cualquier valor faltante con la estadística de movimiento y dejan los valores no perdidos sin cambios. Por ejemplo, la siguiente sentencia sustituye cualquier valor faltante de la variable X por una media móvil exponencialmente ponderada de los valores pasados ​​de X y deja sin cambios los valores no perdidos. Los valores faltantes se interpolan utilizando la media móvil ponderada exponencial especificada. (Esto también se llama suavizado exponencial simple.) La siguiente declaración reemplaza cualquier valor faltante de la variable X con la media general de X. Puede utilizar el operador SETMISS para reemplazar valores perdidos con un número especificado. Por ejemplo, la siguiente declaración reemplaza cualquier valor faltante de la variable X con el número 8.77. Operadores clásicos de descomposición Si se trata de una serie temporal estacional con observaciones por estación, los métodos clásicos de descomposición dividen las series temporales en cuatro componentes: tendencias, ciclos, componentes estacionales e irregulares. Los componentes de tendencia y ciclo a menudo se combinan para formar el componente de ciclo de tendencia. Hay dos formas básicas de descomposición clásica: multiplicativa y aditiva, que se muestran a continuación. Ejemplos de uso Los índices estacionales multiplicativos son 0.9, 1.2. 0,8 y 1,1 para los cuatro trimestres. Sea SEASADJ una variable de series temporales trimestrales que se ha ajustado estacionalmente de manera multiplicativa. Para restablecer la estacionalidad a SEASADJ utilice la siguiente transformación: Los índices estacionales aditivos son 4.4, -1.1, -2.1 y -1.2 para los cuatro trimestres. Sea SEASADJ una variable de series temporales trimestrales que se ha ajustado estacionalmente de manera aditiva. Para restaurar la estacionalidad en SEASADJ, utilice la siguiente transformación: Operadores de conjunto Para los operadores de conjunto, el primer parámetro,, representa el valor a reemplazar y el segundo parámetro,, representa el valor de reemplazo. El reemplazo se puede localizar al principio, medio o final de la serie. Ejemplos de uso Supongamos que una tienda se abrió recientemente y que el historial de ventas se almacena en una base de datos que no reconoce valores perdidos. Aunque la demanda puede haber existido antes de la apertura de los almacenes, esta base de datos asigna el valor de cero. Modelar el historial de ventas puede ser problemático porque el historial de ventas es casi cero. Para compensar esta deficiencia, los valores iniciales cero se deben establecer como ausentes con los valores cero restantes sin cambios (lo que representa ninguna demanda). Asimismo, supongamos que una tienda está cerrada recientemente. La demanda puede todavía estar presente y por lo tanto un valor registrado de cero no refleja con exactitud la demanda real. Escala OperadorEstoy tratando de calcular promedios móviles trimestrales dentro de un grupo por grupo sin embargo, hay diferentes números de observaciones dentro de cada grupo. He visto algunos ejemplos, pero ellos asumen que el mismo número de observaciones necesita ser promediado a través de. He aquí un ejemplo: los artículos a y d se compran en cada trimestre, pero el artículo b sólo se compra en el segundo y tercer trimestre, mientras que el artículo c se compra sólo en el cuarto 4. Por lo tanto, Cantidad El ejemplo anterior es una especie de versión diluida. Estoy utilizando datos de series de tiempo y aunque un artículo se compra cada trimestre en un año, no se puede comprar cada trimestre en otro año, o no se puede comprar en absoluto para un año en particular. ¿Hay una manera simple de calcular promedios móviles para este tipo de datos sin interpolación Si es posible, también puede incluir un ejemplo con interpolación Cualquier ayuda sería apreciada. He tratado de ampliar los datos para incluir los valores faltantes para que los promedios móviles se pueden calcular como paigemiller ha sugerido. Estoy trabajando con SAS / ETS por cierto. Estoy utilizando datos mensuales y la variable de fecha está formateada como monyy. Aquí está el código que estoy usando para expandir los datos: proc class datafisher3 por clase item fecha ejecutar proc expandir datafisher3 outfshrexp frommonth methodnone por clase item no incluir la fecha por grupo aquí o no funcionará Pregunta: Pensé que esto resolvió mi falta (Por ejemplo, los valores de una variable comienzan en marzo en lugar de enero y pueden terminar en octubre en lugar de diciembre), estos valores siguen faltando (no aparecen en el Conjunto de datos expandido) aunque el resto de la serie se amplía. ¿Hay una manera, o una opción en la extensión del proc, para conseguir que SAS indique que estos valores están faltando también? También, aquí está el código básico que utilizo para computar promedios móviles. Aunque necesito corregir el problema de valores faltantes, este código funciona muy bien. Puede convertir múltiples vars a la vez y utilizar varias sentencias de conversión para crear diferentes promedios móviles a la vez para esas vars. Proc sort dataold por clase item fecha ejecutar proc expandir dataold outnew convertir var1movingaverage / methodnone transformout (movave 3) Soy un poco nuevo en el uso y la escritura de código SAS, y estoy tratando de crear un cálculo de media móvil. He encontrado ejemplos y basado en lo que he leído y probado, no puedo parecen obtener mis datos para producir los resultados deseados. Aquí hay un ejemplo de mis datos. Año Mes Ventas Corriente Suma 2011 Ene 100 100 2011 Feb 250 350 2011 Marzo 200 550 2012 Ene 175 175 2012 Feb 300 475 2012 Marzo 225 700 2017 Ene 150 150 2017 Feb 275 425 2017 Marzo 250 675 Tengo Año, Mes, Ventas y Una suma corriente de las ventas mensuales de cada año. Me gustaría poder comparar la suma corriente de ventas a través del mes actual y compararla con el promedio de los últimos años a través de ese mismo mes. He intentado usar PROC EXPAND, y eso parece trabajar, pero solamente cuando mi dataset tiene año y ventas. Gracias por tu ayuda. Es muy apreciado. 2011 Enero 100 100. 2011 feb 250 350. 2011 Marzo 200 550. 2012 Ene 175 175 100 2012 Feb 300 475 350 2012 Marzo 225 700 550 2017 Enero 150 150 138 ((175100) / 2) 2017 Feb 275 425 413 ((475350) / 2) 2017 Marzo 250 675 625 ((700550) / 2 ) La columna Promedio calcula la suma corriente a través de cada mes y divide esa cifra por el número de períodos anteriores. Ver los cálculos entre paréntesis. En realidad estoy tratando de calcular un promedio de cuatro años, pero sé que no incluyeron suficientes datos en mi muestra para calcular los cuatro años completos. Puedo usar PROC EXPAND para calcular una media móvil, pero sólo obtengo el código para trabajar cuando tuve las columnas Año y Ventas (en total acumulativo) en mi conjunto de datos. Las ventas fueron para el año completo, no desglosadas por mes. Para 2011, las ventas fueron de 550. Para 2012, las ventas fueron 700. Así que, ¿cómo puedo calcular el promedio móvil con más de dos columnas en mi tabla Espero que esta explicación ayuda a responder a sus preguntas. Gracias de nuevo. Una solución (entre otras) utilizando DATA STEP. He añadido los años 2017 y 2017 para ver si entendí la pregunta. Data thave input año mes tarjetas de ventas 2011 Ene 100 2011 Feb 250 2011 Mar 200 2012 Ene 175 2012 Feb 300 2012 Marzo 230 2017 Ene 150 2017 Feb 275 2017 Mar 250 2017 Enero 125 2017 Feb 200 2017 Mar 175 2017 Ene 105 2017 Feb 210 2017 Mar 275 fecha de los datos (mes de año de venta Rsum Ravg) conjunto de longitud de ths Rsum Ravg 8. retener Rsum Ravg Ssum Si Cuervo array zMth (3) por año si first. year entonces Crow0 Si1 Rsum0 final Crow1 RsumSales if (Si gt 1) entonces Ravg redondo (zMth (cuervo) / (Si-1), 0.01) else Ravg. ZMth (Cuervo) Rsum proc print datatwant run 1 2011 Ene 100 100. 2 2011 Feb 250 350. 3 2011 Mar 200 550. 4 2012 Ene 175 175 100.00 5 2012 Feb 300 475 350.00 6 2012 Marzo 225 700 550.00 7 2017 Enero 150 150 137,50 8 2017 Feb 275 425 412,50 9 2017 Mar 250 675 625,00 10 2017 Enero 125 125 141,67 (100175150) / 3 11 2017 Feb 200 325 416,67 (350475425) / 3 12 2017 Mar 175 500 641,67 (550700675) / 3 13 2017 Ene 105 105 137,50 (100175150125) / 4 14 2017 Feb 210 315 393,75 (350475425325) / 4 15 2017 Mar 275 590 606,25 (550700675500) / 4

No comments:

Post a Comment