Moving Average Sas By Proc Expand


Im um novato de SAS e Im curioso se a seguinte tarefa puder ser feita muito mais simples como está atualmente em minha cabeça. Tenho os seguintes meta dados em uma tabela chamada userdatemoney: Usuário - Data - Dinheiro com vários usuários e datas para cada dia do calendário (nos últimos 4 anos). Os dados são ordenados pelo usuário ASC e Data ASC, os dados de exemplo se parece com isto: Eu agora quero calcular uma média móvel de cinco dias para o dinheiro. Eu comecei com o apprach muito popular com a função lag () como este: como você vê, o problema com este método ocorre se lá se a etapa de dados é executado em um novo usuário. Aron obteria alguns valores defasados ​​de Anna que, naturalmente, não deveria acontecer. Agora a minha pergunta: Tenho certeza que você pode lidar com o usuário mudar adicionando alguns campos extras como laggeduser e redefinindo as variáveis ​​N, Soma e média se você notar tal interruptor, mas: Isso pode ser feito de uma maneira mais fácil Talvez usando o Por Cláusula de qualquer maneira Obrigado por suas idéias e ajuda Eu acho que a maneira mais fácil é usar PROC EXPAND: E como mencionado no comentário de Johns, é importante lembrar sobre valores faltantes (e sobre observações de começo e término também). Eu adicionei SETMISS opção para o código, como você deixou claro que você deseja zerofy valores em falta, não ignorá-los (comportamento padrão MOVAVE). E se você quiser excluir as primeiras 4 observações para cada usuário (já que elas não têm pré-histórico suficiente para calcular a média móvel 5), você pode usar a opção TRIMLEFT 4 dentro de TRANSFORMOUT (). Respondido Dec 3 13 at 15: 29 Começando na versão 6.08 do sistema SAS, PROC EXPAND no software SAS / ETS pode ser usado para fazer uma variedade de transformações de dados. Essas transformações incluem: leads, atrasos, médias móveis ponderadas e não ponderadas, somas móveis e somas cumulativas, para citar apenas algumas. Muitas novas transformações foram adicionadas na versão 6.12, incluindo especificações separadas para médias centradas e para trás. Essas novas transformações tornaram necessário modificar a sintaxe de algumas das transformações suportadas antes da Versão 6.12. Exemplos de como especificar a sintaxe para médias centradas e para trás movendo usando a versão 6.11 e anterior e versão 6.12 e posterior são dadas abaixo. PROC EXPAND pode calcular uma média móvel centrada ou uma média móvel para trás. Uma média móvel centrada em 5 períodos é calculada pela média de um total de 5 valores consecutivos da série (o valor do período corrente, além dos dois valores imediatamente anteriores e dois valores imediatamente a seguir ao valor actual). Uma média de retrocesso de 5 períodos é calculada pela média do valor do período corrente com os valores dos 4 períodos imediatamente anteriores. A sintaxe a seguir ilustra como usar a especificação TRANSFORM (MOVAVE n) para calcular uma média móvel centrada em 5 períodos usando a Versão 6.11 ou anterior: Para calcular uma média móvel de retrocesso de n períodos usando a Versão 6.11 ou anterior, use TRANSFORM (MOVAVE) N LAG k) especificação, onde k (n-1) / 2 se n é ímpar ou onde k (n-2) / 2 se n é par. A seguinte sintaxe ilustra como usar a especificação TRANSFORM (CMOVAVE n) para calcular uma média móvel centrada em 5 períodos usando a Liberação 6.12 ou Mais tarde: A seguinte sintaxe semelhante ilustra como usar a especificação TRANSFORM (MOVAVE n) para calcular uma média de retrocesso de 5 períodos usando a Versão 6.12 ou posterior: Para obter mais informações, consulte Operações de Transformação no capítulo EXPAND do Guia do Usuário do SAS / ETS . Se você não tiver acesso ao SAS / ETS, poderá calcular uma média móvel na etapa DATA, conforme ilustrado neste programa de exemplo. Informações do Sistema Operacional e de Liberação As operações que podem ser usadas nas opções TRANSFORMIN e TRANSFORMOUT são mostradas na Tabela 14.1. As operações são aplicadas a cada valor da série. Cada valor da série é substituído pelo resultado da operação. Na Tabela 14.1. Ou x representa o valor da série em um determinado período de tempo t antes que a transformação seja aplicada, representa o valor da série de resultados e N representa o número total de observações. A notação n indica que o argumento n é opcional, o padrão é 1. A janela de notação é usada como o argumento para os operadores de estatísticas móveis e indica que você pode especificar um número inteiro de períodos n ou uma lista de n pesos em parênteses. A seqüência de notação é usada como o argumento para os operadores de seqüência e indica que você deve especificar uma seqüência de números. A notação s indica o comprimento da sazonalidade, e é um argumento exigido. Tabela 14.1 Operações de Transformação Movendo Operadores de Janela de Tempo Alguns operadores calculam estatísticas para um conjunto de valores dentro de uma janela de tempo em movimento, estes são chamados de operadores de janela de tempo em movimento. Existem versões centradas e para trás desses operadores. Os operadores de janela de tempo em movimento centrado são CMOVAVE, CMOVCSS, CMOVGMEAN, CMOVMAX, CMOVMED, CMOVMIN, CMOVPROD, CMOVRANGE, CMOVRANK, CMOVSTD, CMOVSUM, CMOVTVALUE, CMOVUSS e CMOVVAR. Estes operadores calculam as estatísticas dos valores das observações. Os operadores de janela de tempo de movimento para trás são MOVAVE, MOVCSS, MOVGMEAN, MOVMAX, MOVMED, MOVIM, MOVPROD, MOVRANGE, MOVRANK, MOVSTD, MOVSUM, MOVTVALUE, MOVUSS e MOVVAR. Estes operadores calculam estatísticas dos valores. Todos os operadores de janela de tempo em movimento aceitam um argumento especificando o número de períodos a serem incluídos na janela de tempo. Por exemplo, a seguinte instrução calcula uma média móvel de retrocesso de cinco períodos de X. Neste exemplo, a transformação resultante é A seguinte instrução calcula uma média móvel centrada de cinco períodos de X. Neste exemplo, a transformação resultante é Se a janela com um operador de janela de tempo móvel em movimento não for um número ímpar, um valor mais atrasado que o valor de chumbo é incluído na janela de tempo. Por exemplo, o resultado do operador CMOVAVE 4 é Você pode calcular uma operação de janela de tempo de movimento em frente combinando um operador de janela de tempo de movimento para trás com o operador REVERSE. Por exemplo, a seguinte instrução calcula uma média móvel forward de cinco períodos de X. Neste exemplo, a transformação resultante é Alguns dos operadores de janela de tempo móvel permitem especificar uma lista de valores de peso para calcular estatísticas ponderadas. Estes são CMOVAVE, CMOVCSS, CMOVGMEAN, CMOVPROD, CMOVSTD, CMOVTVALUE, CMOVUSS, CMOVVAR, MOVAVE, MOVCSS, MOVGMEAN, MOVPROD, MOVSTD, MOVTVALUE, MOVUSS e MOVVAR. Para especificar um operador de janela de tempo de movimento ponderado, insira os valores de peso entre parênteses após o nome do operador. A largura da janela é igual ao número de pesos que você especificar não especificar. Por exemplo, a seguinte instrução calcula uma média móvel ponderada de cinco períodos centrada de X. Neste exemplo, a transformação resultante é. Os valores de peso devem ser maiores que zero. Se os pesos não somarem 1, os pesos especificados são divididos pela sua soma para produzir os pesos usados ​​para calcular a estatística. Uma janela de tempo completo não está disponível no início da série. Para os operadores centrados uma janela completa também não está disponível no final da série. O cálculo dos operadores de janela de tempo móvel é ajustado para estas condições de contorno como se segue. Para operadores de janela que se movem para trás, a largura da janela de tempo é encurtada no início da série. Por exemplo, os resultados do operador MOVSUM 3 são valores ausentes Você pode truncar o comprimento da série de resultados usando os operadores TRIM, TRIMLEFT e TRIMRIGHT para definir valores a serem faltando no início ou no final da série. Você pode usar essas funções para aparar os resultados dos operadores de janela de tempo em movimento para que a série de resultados contenha apenas valores calculados a partir de uma janela de tempo de largura total. Por exemplo, as seguintes instruções calculam uma média móvel de cinco períodos centrada de X. E eles definem valores faltando nas extremidades da série que são médias de menos de cinco valores. Normalmente, a janela de tempo móvel e os operadores de estatísticas cumulativas ignoram os valores em falta e calculam os respectivos resultados para os valores não perdidos. Quando precedido pelo operador NOMISS, estas funções produzem um resultado em falta se qualquer valor dentro da janela de tempo estiver em falta. O operador NOMISS não executa quaisquer cálculos, mas serve para modificar a operação do operador da janela de tempo móvel que a segue. O operador NOMISS não tem efeito a menos que seja seguido por um operador de janela de tempo móvel. Por exemplo, a instrução a seguir calcula uma média móvel de cinco períodos da variável X, mas produz um valor ausente quando qualquer um dos cinco valores está faltando. A instrução a seguir calcula a soma cumulativa da variável X, mas produz um valor ausente para todos os períodos após o primeiro valor X em falta. Semelhante ao operador NOMISS, o operador MISSONLY não executa quaisquer cálculos (a menos que seja seguido pela opção MEAN), mas serve para modificar a operação do operador da janela de tempo móvel que a segue. Quando precedido pelo operador MISSONLY, estes operadores de janela de tempo de movimento substituem quaisquer valores em falta pela estatística de movimento e deixam valores não perdidos inalterados. Por exemplo, a instrução a seguir substitui quaisquer valores ausentes da variável X por uma média móvel exponencialmente ponderada dos valores passados ​​de X e deixa inalterados os valores não perdidos. Os valores em falta são interpolados utilizando a média móvel exponencialmente ponderada especificada. (Isso também é chamado de suavização exponencial simples.) A seguinte declaração substitui quaisquer valores ausentes da variável X pela média geral de X. Você pode usar o operador SETMISS para substituir valores ausentes por um número especificado. Por exemplo, a seguinte declaração substitui quaisquer valores ausentes da variável X pelo número 8.77. Operadores de Decomposição Clássica Se é uma série temporal sazonal com observações por estação, os métodos clássicos de decomposição dividem as séries temporais em quatro componentes: tendência, ciclo, sazonalidade e componentes irregulares. Os componentes de tendência e ciclo são frequentemente combinados para formar a componente tendência-ciclo. Existem duas formas básicas de decomposição clássica: multiplicativa e aditiva, que são mostradas abaixo. Exemplos de Uso Os índices sazonais multiplicativos são 0,9, 1,2. 0,8 e 1,1 para os quatro trimestres. Seja SEASADJ uma variável de séries temporais trimestral que tenha sido ajustada sazonalmente de forma multiplicativa. Para restaurar a sazonalidade para SEASADJ use a seguinte transformação: Os índices sazonais aditivos são 4,4, -1,1, -2,1 e -1,2 para os quatro trimestres. Seja SEASADJ uma variável de séries temporais trimestrais que tenha sido ajustada sazonalmente de forma aditiva. Para restaurar a sazonalidade para SEASADJ use a seguinte transformação: Set Operators Para os operadores set, o primeiro parâmetro,, representa o valor a ser substituído eo segundo parâmetro,, representa o valor de substituição. A substituição pode ser localizada para o início, meio ou fim da série. Exemplos de uso Suponha que uma loja tenha sido aberta recentemente e que o histórico de vendas esteja armazenado em um banco de dados que não reconheça valores ausentes. Mesmo que a demanda possa ter existido antes da abertura das lojas, esse banco de dados atribui o valor de zero. Modelar o histórico de vendas pode ser problemático porque o histórico de vendas é quase zero. Para compensar esta deficiência, os valores zero iniciais devem ser definidos como faltando com os valores zero restantes inalterados (representando nenhuma demanda). Da mesma forma, suponha que uma loja esteja fechada recentemente. A demanda pode ainda estar presente e, portanto, um valor registrado de zero não reflete com precisão a demanda real. Scale OperatorIn neste post, eu mostro um truque para fazer cálculo de média móvel (pode ser estendido para outras operações que exigem funções de janelas) que é super rápido. Muitas vezes, os analistas SAS precisam realizar cálculos de média móvel e existem várias opções pela ordem de preferência: 1. PROC EXPAND 2. DATA PASSO 3. PROC SQL Mas muitos sites podem não licenciados SAS / ETS para usar PROC EXPAND e fazer média móvel Em DATA STEP requer alguma codificação e é propenso a erros. PROC SQL é uma escolha natural para programadores júnior e em muitos casos de negócios a única solução, mas o SAS SQL PROC não possui funções de janelas que estão disponíveis em muitos DBs para facilitar o cálculo da média móvel. Uma técnica que as pessoas costumam usar é CROSS JOIN, que é muito cara e não é uma solução viável para um conjunto de dados de tamanho médio. Neste post, eu mostro um truque para fazer cálculo de média móvel (pode ser estendido para outras operações que exigem funções de janelas) que é super rápido. Considere o cálculo da média móvel mais simples onde as observações K de arrasto estão incluídas no cálculo, a saber MA (K), aqui nós ajustamos K5. Primeiro, geramos um dado de amostra de 20 obs, onde a variável ID deve ser usada para o windowing ea variável X deve ser usada no cálculo do MA, e então aplicamos o CROSS JOIN padrão para examinar primeiro os dados resultantes, Non-Grouped, apenas Para entender como alavancar a estrutura de dados. A partir do conjunto de dados resultante, é difícil encontrar uma pista, agora vamos classificar por quotbidquot coluna neste conjunto de dados: a partir desta triada dados, é claro que nós realmente don39t tem CROSS JOIN todo o conjunto de dados originais, mas em vez disso, Podemos gerar um conjunto de dados de quotoperationquot que contém o valor de diferença e deixar o conjunto de dados original CROSS JOIN com este conjunto de dados de quotoperationquot muito menor e todos os dados que precisamos usar para o cálculo de MA estarão lá. Agora vamos fazer isso: CROSS JOIN dados originais com quotoperationquot dados, classificar por (a. idops), que é realmente quotbid39 no conjunto de dados classificados Note que no código acima, é necessário ter ax multiplicar por b. weight para que os dados Pode ser inter-leaved, caso contrário o mesmo valor X da tabela original será saída e MA cálculo será falha. A variável de peso explícito realmente acrescenta mais flexibilidade ao cálculo de MA inteiro. Ao configurá-lo para ser 1 para todos os obs resultam em um simples cálculo de MA, atribuir pesos diferentes ajudará a resolver MA mais complexa computação, tais como dar outras observações menos peso para um MA decaído. Se for necessário um parâmetro K diferente nos cálculos de MA (K), somente o conjunto de dados de operação precisa ser atualizado, o que é um trabalho trivial. Agora, o modelo de código real para o cálculo do MA (K) será: Com este novo método, é interessante compará-lo com o auto caro CROSS JOIN, bem como a PROC EXPAND. Na minha estação de trabalho (Intel i5 3.8Ghz, 32GB de memória, 1TB 72K HDD), auto CROSS JOIN é proibitivamente longo em tempo de execução (se os dados são grandes), enquanto o novo método usa apenas 2X tanto tempo como PROC EXPAND, ambos os consumos de tempo são Trivial comparando a auto CROSS JOIN. O consumo de tempo mostrado abaixo está em quotsecondquot. Abaixo está o código leitores podem executar e comparar-se. Postado 10 de maio de 2015 por Liang Xie Programação SAS para Mineração de DadosEu sou um pouco novo em usar e escrever código SAS, e estou tentando criar um cálculo de média móvel. Ive encontrado exemplos e com base no que eu li e tentei, eu não consigo obter os meus dados para produzir os resultados desejados. Aqui está um exemplo dos meus dados. Ano Mês Vendas Executando Soma 2011 Jan 100 100 2011 Feb 250 350 2011 Março 200 550 2012 Jan 175 175 2012 Feb 300 475 2012 março 225 700 2013 janeiro 150 150 2013 fevereiro 275 425 2013 março 250 675 Eu tenho ano, mês, vendas e Uma soma corrente das vendas mensais para cada ano. Gostaria de ser capaz de comparar a soma corrente de vendas através do mês atual e compará-lo com a média dos últimos anos até o mesmo mês. Eu tentei usar PROC EXPAND, e que parece funcionar, mas apenas quando o meu dataset tem Ano e Vendas. Obrigado pela ajuda. É muito apreciado. 2011 Jan 100 100. 2011 fev 250 350. 2011 Março 200 550. 2012 Jan. 175 175 100 2012 Fev 300 475 350 2012 março 225 700 550 2013 janeiro 150 150 138 ((175100) / 2) 2013 fev 275 425 413 ((475350) / 2) 2013 março 250 675 625 ((700550) / 2 ) A coluna Média calcula a Soma Corrente ao longo de cada mês e divide esse valor pelo número de períodos anteriores. Veja os cálculos entre parênteses. Im realmente tentando calcular uma média de quatro anos, mas eu sei que eu não incluíram dados suficientes na minha amostra para calcular os quatro anos completos. Eu sou capaz de usar PROC EXPAND para calcular uma média móvel, mas eu só obter o código para trabalhar quando eu tinha o ano e vendas (no total cumulativo) colunas no meu conjunto de dados. As vendas foram para o ano inteiro, não quebrado por mês. Para 2011, as vendas foram 550. Para 2012, as vendas foram 700. Então, como faço para calcular a média móvel com mais de duas colunas na minha tabela Espero que esta explicação ajuda a responder às suas perguntas. Obrigado novamente. Uma solução (entre outros) usando DATA STEP simples. Eu adicionei anos 2014 e 2015 para ver se eu entendi a pergunta. Dados dados input ano mês vendas cartões 2011 Jan 100 2011 Feb 250 2011 Mar 200 2012 Jan 175 2012 Feb 300 2012 Mar 225 2013 Jan 150 2013 Feb 275 2013 Mar 250 2014 Jan 125 2014 Feb 200 2014 Mar 175 2015 Jan 105 2015 Feb 210 2015 Mar 275 dados twant (keepyear mês vendas Rsum Ravg) conjunto thave comprimento Rsum Ravg 8. reter Rsum Ravg Ssum Si Crow array zMth (3) por ano se first. year então fazer Crow0 Si1 Rsum0 fim Crow1 RsumSales if (Si gt 1) então Ravg redondo (zMth (Corvo) / (Si-1), 0,01) mais Ravg. ZMth (Corvo) Rsum proc print datatwant executar 1 2011 Jan 100 100. 2 2011 Feb 250 350. 3 2011 Mar 200 550. 4 2012 Jan 175 175 100,00 5 2012 Feb 300 475 350,00 6 2012 Mar 225 700 550,00 7 2013 Jan 150 150 137,50 8 2013 Feb 275 425 412,50 9 2013 Mar 250 675 625,00 10 2014 Jan 125 125 141,67 (100175150) / 3 11 2014 Fev 200 325 416,67 (350475425) / 3 12 2014 Mar 175 500 641,67 (550700675) / 3 13 2015 Jan 105 105 137,50 (100175150125) / 4 14 2015 Feb 210 315 393,75 (350475425325) / 4 15 2015 Mar 275 590 606,25 (550700675500) / 4

Comments