Thursday, November 3, 2016

Promedio Móvil Sas 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 a las 15: 29En este post, muestro un truco para hacer cálculo de media móvil (se puede ampliar a otras operaciones que requieren funciones de ventana) que es súper rápido. A menudo, los analistas SAS necesitan realizar cálculos de promedio móvil y hay varias opciones por orden de preferencia: 1. PROC EXPAND 2. DATOS PASO 3. PROC SQL Pero muchos sitios no pueden licenciar SAS / ETS para usar PROC EXPAND y hacer el promedio móvil En DATA STEP requiere cierta codificación y es propenso a errores. PROC SQL es una opción natural para los programadores junior y en muchos casos empresariales la única solución, pero SAS PROCs SQL no tiene funciones de ventanas que están disponibles en muchos DB para facilitar el cálculo del promedio móvil. Una técnica que la gente suele utilizar es CROSS JOIN, que es muy costosa y no es una solución viable para un conjunto de datos de tamaño medio. En este post, muestro un truco para hacer cálculo de promedio móvil (se puede extender a otras operaciones que requieren funciones de ventana) que es súper rápido. Considere el cálculo de la media móvil más simple en el que las observaciones K de arrastrado se incluyen en el cálculo, a saber MA (K), aquí nos fijamos K5. En primer lugar, generar una muestra 20 obs datos, donde la variable ID se utiliza para la ventana y la variable X se va a utilizar en el cálculo de MA, y luego aplicar el CROSS JOIN estándar para examinar primero los datos resultantes, no agrupados, Para entender cómo aprovechar la estructura de datos. A partir de este conjunto de datos resultante, es difícil encontrar una pista, ahora vamos a ordenar por la columna quotbidquot en este conjunto de datos: De estos datos clasificados, está claro que en realidad no tenemos que CROSS JOIN todo el conjunto de datos originales, Podemos generar un conjunto de datos de quotoperationquot que contiene el valor de diferencia y dejar que el conjunto de datos originales CROSS JOIN con este conjunto de datos quotoperationquot mucho más pequeño y todos los datos que necesitamos utilizar para el cálculo de MA estarán allí. Ahora vamos a hacerlo: CROSS JOIN datos originales con quotoperationquot datos, ordenar por (a. idops), que es en realidad quotbid39 en el conjunto de datos clasificados Tenga en cuenta que en el código anterior, es necesario tener ax multiplicar por b. weight para que los datos Puede ser entre hojas, de lo contrario se saldrá el mismo valor de X de la tabla original y se fallará el cálculo de MA. La variable de peso explícito añade realmente más flexibilidad al cálculo de MA completo. Si bien establecerlo como 1 para todos los obs resulta en un simple cálculo de MA, asignar pesos diferentes ayudará a resolver la computación MA más compleja, como dar más observaciones menos peso para una MA decaída. Si se requiere un parámetro K diferente en los cálculos de MA (K), solo se debe actualizar el conjunto de datos de la operación que es un trabajo trivial. Ahora la plantilla de código real para el cálculo de MA (K) será: Con este nuevo método, es interesante compararlo con el auto costoso CROSS JOIN así como con PROC EXPAND. En mi estación de trabajo (Intel i5 3.8Ghz, 32GB de memoria, 1TB 72K HDD), auto CROSS JOIN es prohibitivamente largo en tiempo de ejecución (si los datos son grandes), mientras que el nuevo método utiliza sólo 2X tanto tiempo como PROC EXPAND, ambos consumos de tiempo son Trivial comparando a uno mismo CROSS JOIN. El consumo de tiempo que se muestra a continuación es en quotsecondquot. Debajo están los lectores de código pueden funcionar y compararse. Publicado el 10 de mayo de 2015 por Liang Xie Programación SAS para Data Mining En el lanzamiento 6.08 del sistema SAS, PROC EXPAND en el software SAS / ETS puede utilizarse 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

No comments:

Post a Comment