Wednesday 19 July 2017

Moving Average Calculation In Sas


Eu sou um iniciante do SAS e estou curioso se a seguinte tarefa pode ser feita muito mais simples, pois atualmente está na minha cabeça. Eu tenho os seguintes metadados (simplificados) 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 amostra são assim: agora eu quero calcular uma média móvel de cinco dias para o Money. Eu comecei com o apprach muito popular com a função lag () como esta: como você vê, o problema com este método ocorre se houver se o passo de dados for executado em um novo usuário. Aron teria alguns valores atrasados ​​de Anna, que, claro, não deveria acontecer. Agora, minha pergunta: Tenho certeza de que você pode lidar com a mudança do usuário, adicionando alguns campos extras como o laggeduser e redefinindo as variáveis ​​N, Soma e Média se você notar tal comutador, mas: Isso pode ser feito de maneira mais fácil. POR Cláusula de qualquer maneira Obrigado por suas idéias e ajuda, acho que a maneira mais fácil é usar PROC EXPAND: E como mencionado no comentário de Johns, é importante lembrar sobre valores faltantes (e também sobre observações iniciais e finais). Eu adicionei a opção SETMISS ao código, como você deixou claro que deseja esconder valores faltantes, não ignorá-los (comportamento MOVAVE padrão). E se você quiser excluir as primeiras 4 observações para cada usuário (uma vez que 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 (). Respondeu 3 de dezembro 13 às 15: 29 incluí uma captura de tela para ajudar a esclarecer meu problema: estou tentando calcular algum tipo de média móvel e desvio padrão móvel. A coisa é que eu quero calcular os coeficientes de variação (stdevavg) para o valor real. Normalmente, isto é feito calculando o stdev e o avg nos últimos 5 anos. No entanto, às vezes, haverá observações no meu banco de dados para o qual não tenho informações dos últimos 5 anos (talvez apenas 3, 2 etc). É por isso que eu quero um código que irá calcular o avg e stdev, mesmo que não haja informações durante os 5 anos inteiros. Além disso, como você vê nas observações, às vezes eu tenho informações em mais de 5 anos, quando é esse o caso, eu preciso de algum tipo de média móvel que me permita calcular o valor médio e padrão nos últimos 5 anos. Então, se uma empresa tem informações por 7 anos, preciso de algum tipo de código que avaliará o avg e stdev, digamos, 1997 (em 1991-1996), 1998 (em 1992-1997) e 1999 (1993-1998). Como não estou muito familiarizado com os comandos do sas, deve parecer (muito muito grosso modo) como: Ou algo assim, eu realmente não tenho idéia, vou tentar descobrir, mas vale a pena publicá-lo se não encontrar. Com a média móvel do intervalo de datas com a média móvel do intervalo de datas com o intervalo de data Im novo no SAS, e estou tendo alguns problemas com o cálculo da média móvel com base em datas e agrupamentos dentro do conjunto de dados. Basicamente, estou tentando calcular a média móvel para cada observação com base nos últimos 90 dias. Cada observação tem uma data. Eu também preciso agrupá-los para que a média móvel seja baseada apenas no grupo. Em outras palavras, se eu fosse agrupá-lo por frutas, as maçãs teriam sua única média móvel e orages, etc. Eu sei que precisarei classificar o conjunto de dados primeiro, depois usar uma declaração de retenção. Eu também estava pensando em fazer uma macro também. Eu comecei isso, mas não consigo entender nada para funcionar. Alguém pode me ajudar? Eu sei como fazer a classificação, mas também sei como obter a média, mas não está agrupando corretamente. Só me dá o valor da observação. Então tentei fazê-lo com SQL, mas também não está funcionando. É isso que eu criei. Proc sql cria tabela data. movingavg como selecione a., Mean (base) como se move de xx onde o grupo datado por produto RE: média móvel com intervalo de datas, isso também não funciona. Dados novo definido antigo por id manter base se data90 então média médio (base) executar RE: média móvel com intervalo de datas Aqui está um exemplo do meu conjunto de dados. Data base do produto maçã may20 4 laranja março2 3 maçã 3 de abril banana jan31 33 maçã feb13 88 maçã dec2 12 o que eu preciso é uma média móvel de execução dos últimos 90 dias por produto com base no montante de base. Desculpe pela postagem múltipla, mas depois de reler minha publicação anterior, pareceu confuso sobre o que estou tentando fazer. Obrigado RE: média móvel com intervalo de data klaz2002 (Programador) 25 Set 07 16:00 Devo começar por agradecer por esta questão. Porque não me deu descanso até que eu pudesse resolvê-lo. Permitam-me que indique o que acredito ser sua exigência apenas para que você e eu estivéssemos na mesma página. Req 1) Você deseja ter uma média móvel dos últimos 90 dias de dados por nome do produto. Significado, que para um único produto (ex. Apple) você só está interessado nos valores-base desse produto que retorna 90 dias. 2) Eu assumi que você tenha um (1) registro por produto por dia. Isso significa que você nunca tem mais de um valor básico por produto por dia. (O código não lida mais agora) Para resolver o problema da história (valores que retornam 90 dias) usei o lagx () e coloquei os dias 1-90 em variáveis ​​e depois adicionei-os a um ARRAY. Uma vez que a variável deve ser incluída na matriz, criei uma pequena macro que gerou as linhas de código que eu precisava. MACRO QUE CRIA 270 VARIÁVEIS PARA 90 DIAS DE HISTÓRIA macro SetVars do i1 a 90 prodampi lagampi (produto) dateampi lagampi (data) baseampi lagampi (base) end mend PRIMEIRO ORDEN PELO PRODUTO E DATA proc classificar dados yourdata out datasetado por data do produto executar dados Conjunto final fornecido pelo produto data comprimento prod1-prod90 7 date1-date90 base1-base90 mysum 8 array atual mysum array prod prod1-prod90 array dt data1-date90 array bs basis1-basis90 SetVars CONFIGURAR A DATA 90 DIAS AGORA PARA VERIFICAR DataMinus90 data-90 Bctr 1 mysum 0 LOOP ATRAVÉS DE TODOS OS DÍAS POSSÍVEIS i1 a 90 ESCRIBEM EXCEÇÃO PARA PRIMEIRO CASO NO GRUPO DE PRODUTOS, COMO NÃO HÁ MAIS GOSTO, se for primeiro. Produto então base em movimento. VERIFIQUE PARA O MESMO NOME DO PRODUTO E, DENTRE 90 DIAS, se for ajustado (upcase (prod )) Trim (upcase (produto)) e dt dateminus90, então, SEJA ENCONTRADO ADICIONAL A SUM VAR mysum sum (mysum, base, bs) MANTENHA UM CONTO DE QUEM MAIS DATAPOINTS ENCONTRADO bctr 1 end end SE NENHUM ENCONTRADO ENCONTRO O VALOR DE BASE ATUAL DEVE SER USADO Se mysum 0 então myavg base else myavg mysumbctr executar proc imprimir dataFINAL var data do produto dateminus90 base myavg formato data dateminus90 mmddyy10. Corre, espero que isso ajude você. Você realmente deve olhar isso como eu fiz isso realmente sem verificação extensiva. Pode haver muitas limitações a este código, então cuidado.

No comments:

Post a Comment