Estou tentando usar R para calcular a média móvel sobre uma série de valores em uma matriz. A pesquisa normal da lista de discussão R não tem sido muito útil. Não parece haver uma função interna em R que me permita calcular médias móveis. Algum pacote fornece um? Ou preciso escrever o meu?
r
moving-average
r-faq
Jared
fonte
fonte
forecast::ma
e ele contém toda a vizinhança, não está certo.Ou você pode simplesmente calcular usando o filtro, aqui está a função que eu uso:
Se você usar
dplyr
, tenha cuidado para especificarstats::filter
na função acima.fonte
stats::filter
sides = 2
é equivalente a align = "center" para o zoo :: rollmean ou RcppRoll :: roll_mean.sides = 1
é equivalente ao alinhamento "correto". Não vejo uma maneira de fazer o alinhamento "esquerdo" ou calcular com dados "parciais" (2 ou mais valores)?O uso
cumsum
deve ser suficiente e eficiente. Supondo que você tenha um vetor x e que deseja uma soma contínua de n númerosConforme apontado nos comentários de @mzuther, isso pressupõe que não haja NAs nos dados. lidar com isso exigiria a divisão de cada janela pelo número de valores não-NA. Aqui está uma maneira de fazer isso, incorporando o comentário de Ricardo Cruz:
Isso ainda tem o problema de que, se todos os valores na janela forem NAs, haverá uma divisão por erro zero.
fonte
cumsum(c(1:3,NA,1:3))
cx <- c(0, cumsum(ifelse(is.na(x), 0, x)))
.Em data.table 1.12.0 nova
frollmean
função foi adicionada para calcular rápida e exata rolando média cuidadosamente manipulaçãoNA
,NaN
e+Inf
,-Inf
valores.Como não há exemplo reproduzível na questão, não há muito mais a ser abordado aqui.
Você pode encontrar mais informações
?frollmean
no manual, também disponível on-line em?frollmean
.Exemplos do manual abaixo:
fonte
O
caTools
pacote possui média de rolagem muito rápida / min / max / sd e poucas outras funções. Eu só trabalhei comrunmean
erunsd
e eles são os mais rápidos de qualquer um dos outros pacotes mencionados até o momento.fonte
Você pode usar
RcppRoll
para médias móveis muito rápidas escritas em C ++. Basta chamar aroll_mean
função. Os documentos podem ser encontrados aqui .Caso contrário, esse loop for (mais lento) deve fazer o truque:
fonte
res = arr
. Depois, há um loop que itera iniciando non
, ou no 15 ° elemento, até o final da matriz. isso significa que o primeiro subconjunto do qual ele leva a média é oarr[1:15]
que preenche o pontores[15]
. Agora, eu prefiro definir emres = rep(NA, length(arr))
vez deres = arr
cada elementores[1:14]
igual a NA, em vez de um número, onde não podemos obter uma média completa de 15 elementos.De fato
RcppRoll
é muito bom.O código postado por cantdutchthis deve ser corrigido na quarta linha da janela a ser corrigida:
Outra maneira, que lida com as perdas, é dada aqui .
Uma terceira maneira, melhorando código deste código para calcular médias parciais ou não, segue:
fonte
Para complementar a resposta de cantdutchthis e Rodrigo Remedio ;
fonte
Aqui está um código de exemplo que mostra como calcular uma média móvel centralizada e uma média móvel final usando a
rollmean
função do pacote zoo .fonte
Embora um pouco lento, mas você também pode usar o zoo :: rollapply para executar cálculos em matrizes.
onde x é o conjunto de dados, FUN = mean é a função; você também pode alterá-lo para min, max, sd etc e width é a janela de rolamento.
fonte
set.seed(123); x <- rnorm(1000); system.time(apply(embed(x, 5), 1, mean)); library(zoo); system.time(rollapply(x, 5, mean))
Na minha máquina, é tão rápido que retorna um tempo de 0 segundos.Pode-se usar o
runner
pacote para mover funções. Neste caso,mean_run
função. O problemacummean
é que ele não lida comNA
valores, masmean_run
sim.runner
O pacote também suporta séries temporais irregulares e o Windows pode depender da data:Pode-se também especificar outras opções como
lag
, e rolar apenasat
índices específicos. Mais na documentação de pacotes e funções .fonte
O pacote deslizante pode ser usado para isso. Ele tem uma interface que foi projetada especificamente para parecer semelhante ao ronronar. Ele aceita qualquer função arbitrária e pode retornar qualquer tipo de saída. Os quadros de dados são ainda iterados em linhas. O site pkgdown está aqui .
A sobrecarga do controle deslizante e da tabela data.t
frollapply()
deve ser bem baixa (muito mais rápida que o zoo).frollapply()
parece ser um pouco mais rápido para este exemplo simples aqui, mas observe que são necessárias apenas entradas numéricas e a saída deve ser um valor numérico escalar. As funções do controle deslizante são completamente genéricas e você pode retornar qualquer tipo de dados.fonte
fonte