Tuesday 21 November 2017

Calcular El Promedio Móvil De 3 Meses En Sas


He incluido una captura de pantalla para ayudar a aclarar mi problema: Estoy tratando de calcular algún tipo de media móvil y la desviación estándar en movimiento. La cosa es que quiero calcular los coeficientes de variación (stdev / avg) para el valor real. Normalmente esto se hace mediante el cálculo de la stdev y avg durante los últimos 5 años. Sin embargo a veces habrá observaciones en mi base de datos para las que no tengo la información de los últimos 5 años (quizás sólo 3, 2 etc). Es por eso que quiero un código que calculará la media y stdev, incluso si no hay información para el conjunto de 5 años. Además, como ves en las observaciones, a veces tengo información de más de 5 años, cuando este es el caso necesito algún tipo de media móvil que me permite calcular el promedio y stdev durante los últimos 5 años. Así que si una empresa tiene información durante 7 años necesito algún tipo de código que calculará el promedio y el stdev para, digamos, 1997 (por 1991-1996), 1998 (1992-1997) y 1999 (1993-1998). Como no estoy muy familiarizado con sas comandos que debe mirar (muy, muy groseramente) como: o algo así, realmente no tengo ni idea, voy a tratar de averiguarlo, pero vale la pena publicarlo si no lo encuentro yo mismo. Post, mostrar un truco para hacer el cálculo de promedio móvil (se puede ampliar a otras operaciones que requieren funciones de ventanas) 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 del 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 el conjunto original de datos, sino que, 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 diferentes pesos ayudará a resolver la computación MA más compleja, como dar observaciones adicionales menos peso para un MA decaído. 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 2017 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 (). Respondió Dec 3 13 at 15:29

No comments:

Post a Comment