Eu 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 durante 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 sas, deve parecer (muito muito grosseiramente) como: Ou algo assim, eu realmente não tenho idéia, vou tentar descobrir, mas vale a pena publicá-lo se eu não o encontrar. Eu sou um Iniciante do SAS e estou curioso se a seguinte tarefa puder ser feita de forma muito mais simples, já que 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 13 de dezembro às 15: 29Nesta postagem, mostro um truque para fazer o cálculo da média móvel (pode ser estendido para outras operações que requerem funções de janelas) que é super rápido. Muitas vezes, os analistas do SAS precisam realizar o cálculo da média móvel e há várias opções pela ordem de preferência: 1. PROC EXPAND 2. DATA STEP 3. PROC SQL Mas muitos sites podem não licenciar SASETS para usar o PROC EXPAND e fazer a média móvel em DATA STEP requer alguma codificação e é propenso a erros. O PROC SQL é uma escolha natural para programadores júnior e em muitos casos comerciais a única solução, mas o PROC SQLs da SAS não possui funções de janelas 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 caro e não é uma solução viável para um conjunto de dados de tamanho médio. Nesta publicação, mostro um truque para fazer o cálculo da média móvel (pode ser estendido para outras operações que requerem funções de janelas) que é super rápido. Considere o cálculo da média móvel mais simples, onde as observações K que se seguem estão incluídas no cálculo, a saber, MA (K), aqui definimos o K5. Geramos primeiro um dado de amostra de 20obs, onde a ID da variável deve ser usada para janelas e a variável X deve ser usada no cálculo de MA e, em seguida, aplicamos o padrão CROSS JOIN para primeiro examinar os dados resultantes, não agrupados, apenas Para entender como alavancar a estrutura de dados. A partir do conjunto de dados resultante, é difícil encontrar uma pista, agora let39s classificar por quotbidquot coluna neste conjunto de dados: A partir desses dados ordenados, é claro que, na verdade, não temos que CRUZAR-SE em todo o conjunto de dados original, mas, em vez disso, Podemos gerar um conjunto de dados quotoperationquot que contém o valor da diferença e deixar o conjunto de dados original CROSS JOIN com este conjunto de dados quotoperationquot muito menor, e todos os dados que precisamos usar para o cálculo MA estarão lá. Agora, faça-o: CROSS JUNTE os dados originais com dados quotoperationquot, classifique por (a. idops), que é realmente quotbid39 no conjunto de dados ordenados. Observe que, no código acima, é necessário ter multiplicado de machado por b. weight para que os dados Pode ser inter-folhas, caso contrário, o mesmo valor X da tabela original será gerado e o cálculo MA será falhado. A variável de peso explícita realmente acrescenta mais flexibilidade ao cálculo do MA inteiro. Ao definir isso como sendo 1 para todos os resultados de obs em um simples cálculo de MA, atribuir pesos diferentes ajudará a resolver uma computação de MA mais complexa, como dar mais observações com menos peso para um MA decadente. Se o parâmetro K diferente em cálculos MA (K) for necessário, apenas o conjunto de dados da operação precisa ser atualizado, o que é um trabalho trivial. Agora, o modelo de código real para o cálculo de MA (K) será: com este novo método, é interessante compará-lo com a auto-estima CROSS JOIN, bem como com PROC EXPAND. Na minha estação de trabalho (Intel i5 3.8Ghz, memória de 32GB, 1TB 72K HDD), self CROSS JOIN é proibitivamente longo no tempo de execução (se o dado for grande) enquanto o novo método usa apenas 2X quanto tempo como PROC EXPAND, ambos os consumos de tempo são Comparação trivial com auto CROSS JOIN. O consumo de tempo mostrado abaixo é em quotesecondquot. Abaixo está o código que os leitores podem executar e comparar-se. Postado em 10 de maio de 2017 pela Liang Xie SAS Programming for Data Mining
No comments:
Post a Comment