Wednesday, November 9, 2016

Media Móvil Sas


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. 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 MiningIm un principiante de SAS y estoy curioso si la siguiente tarea se puede hacer mucho más simple, ya que actualmente está 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 (). El código de ejemplo en la pestaña Código completo ilustra cómo calcular el promedio móvil de una variable a través de un conjunto de datos completo, sobre las últimas N observaciones en un conjunto de datos o sobre las últimas N observaciones dentro de un BY - grupo. Estos ejemplos de archivos y ejemplos de código son proporcionados por SAS Institute Inc. como es sin garantía de ningún tipo, ya sea expresa o implícita, incluyendo pero no limitado a las garantías implícitas de comerciabilidad y aptitud para un propósito en particular. Los recipientes reconocen y aceptan que SAS Institute no será responsable de los daños y perjuicios derivados de su uso de este material. Además, el SAS Institute no proporcionará soporte para los materiales aquí contenidos. Estos ejemplos de archivos y ejemplos de código son proporcionados por SAS Institute Inc. como es sin garantía de ningún tipo, ya sea expresa o implícita, incluyendo pero no limitado a las garantías implícitas de comerciabilidad y aptitud para un propósito en particular. Los recipientes reconocen y aceptan que SAS Institute no será responsable de los daños y perjuicios derivados de su uso de este material. Además, el SAS Institute no proporcionará soporte para los materiales aquí contenidos. Calcular el promedio móvil de una variable a través de un conjunto completo de datos, sobre las últimas N observaciones en un conjunto de datos, o sobre las últimas N observaciones dentro de un grupo BY.

No comments:

Post a Comment