Calculate A Moving Average In Sas
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 (). 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. Calcule 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 grupo BY. Im nuevo a SAS, y estoy teniendo algunos problemas con el cálculo del promedio móvil basado en fechas y agrupaciones dentro del conjunto de datos. Básicamente, estoy tratando de calcular el promedio móvil para cada observación basada en los últimos 90 días. Cada observación tiene una fecha. También necesito agruparlos para que la media móvil se base sólo en el grupo. En otras palabras, si estuviera agrupándolo por frutas, las manzanas tendrían su única media móvil y orajes, etc. Sé que necesitaré ordenar el dataset primero, luego usar una declaración de retención. Yo estaba pensando en hacer una macro también. Comencé esto, pero no parezco conseguir ninguna parte de él al trabajo. ¿Puede alguien ayudarme sé cómo hacer la clasificación, pero también sé cómo obtener el promedio, pero no su agrupación correctamente. Sólo me está dando el valor de la observación. Entonces traté de hacerlo con SQL, pero no funciona tampoco. Esto es lo que me ocurrió. Proc sql create table data. movingavg como select a., Mean (basis) como mover de xx donde el grupo de fecha por grupo RE: el promedio móvil con el rango de fechas no funciona tampoco. Data new set old por id retener base si date90 entonces media avg (base) run RE: media móvil con rango de fechas Aquí hay un ejemplo de mi conjunto de datos. Producto fecha base apple may20 4 naranja march2 3 apple abril 3 banana jan31 33 apple feb13 88 apple dec2 12 lo que necesito es una media móvil en funcionamiento de los últimos 90 días por producto sobre la base de la cantidad base. Lo siento por el post múltiple, pero después de releer mi anterior post, parecía confuso en cuanto a lo que estoy tratando de hacer. Gracias RE: media móvil con rango de fecha klaz2002 (Programador) 25 Sep 07 16:00 Debo empezar diciendo gracias por esta pregunta. Porque no me dio descanso hasta que pude resolverlo. Déjeme decir lo que creo que es su requisito sólo para que usted y yo estamos en la misma página. Req 1) Desea tener una media móvil de los últimos 90 días de datos por nombre de producto. Lo que significa que para un solo producto (por ejemplo, apple) sólo está interesado en los valores base de ese producto que se remonta a 90 días. 2) Asumí que usted tiene un (1) registro por producto por día. Eso significa que usted nunca tiene más de un valor base por producto por día. (El código no maneja más ahora) Para resolver el problema de la historia (los valores se remontan a 90 días) Utilicé el lagx () y poner días 1-90 en las variables y luego agregó a un ARRAY. Dado que la variable debe incluirse en la matriz, he creado una pequeña macro que generó las líneas de código que necesitaba. CÓDIGO MACRO QUE CREA 270 VARIABLES POR 90 DÍAS DE HISTORIA macro SetVars do i1 a 90 prodampi lagampi (fecha) basisampi lagampi (fecha) basisampi lagampi (base) end mend PRIMERO ORDENAR POR PRODUCTO Y FECHA proc ordenar datos data datos por fecha de producto ejecución Data final set datasorted por producto fecha longitud prod1-prod90 7 date1-date90 base1-basis90 mysum 8 matriz actual mysum array prod prod1-prod90 matriz dt fecha1-fecha90 matriz bs base1-base90 SetVars Fijar la fecha 90 días para ver DateMinus90 fecha - 90 bctr 1 mysum 0 LOOP A TRAVÉS DE TODOS LOS DÍAS POSIBLES i1 a 90 ESCRIBA EXCEPCION PARA EL PRIMER CASO EN GRUPO DE PRODUCTO COMO NO HAY NINGÚN GALARDO si primero. producto entonces moviendo basta la base / COMPRUEBE EL MISMO NOMBRE DEL PRODUCTO Y DENTRO DE 90 DÍAS / (Mp3) / MANTENER UNA CUENTA DE CUANTOS DATAPOINTS ENCONTRADOS / bctr 1 end end / SI NINGUNO SE ENCUENTRA ENTONCES SE DEBE UTILIZAR EL VALOR DE LA BASE ACTUAL / if mysum 0 then myavg base myavg mysum / bctr ejecutar proc print dataFINAL var fecha producto dateminus90 base myavg formato fecha dateminus90 mmddyy10. Run Espero que esto te ayude. Usted realmente debe mirar esto encima como lo hice esto realmente sin verificación extensa. Puede haber muchas limitaciones a este código así que ten cuidado.
Comments
Post a Comment