J'essaie d'utiliser R pour calculer la moyenne mobile sur une série de valeurs dans une matrice. La recherche normale de la liste de diffusion R n'a cependant pas été très utile. Il ne semble pas y avoir de fonction intégrée dans R me permettra de calculer des moyennes mobiles. Certains forfaits en fournissent-ils un? Ou dois-je écrire le mien?
r
moving-average
r-faq
Jared
la source
la source
forecast::ma
et il contient tout le quartier, pas bien.Ou vous pouvez simplement le calculer en utilisant le filtre, voici la fonction que j'utilise:
Si vous utilisez
dplyr
, veillez à le spécifierstats::filter
dans la fonction ci-dessus.la source
stats::filter
sides = 2
équivaut à align = "center" pour le zoo :: rollmean ou RcppRoll :: roll_mean.sides = 1
équivaut à un alignement «droit». Je ne vois pas de moyen de faire un alignement «gauche» ou de calculer avec des données «partielles» (2 valeurs ou plus)?L'utilisation
cumsum
doit être suffisante et efficace. En supposant que vous ayez un vecteur x et que vous vouliez une somme courante de n nombresComme indiqué dans les commentaires de @mzuther, cela suppose qu'il n'y a pas de NA dans les données. pour faire face à ceux-ci, il faudrait diviser chaque fenêtre par le nombre de valeurs non NA. Voici une façon de le faire, en intégrant le commentaire de @Ricardo Cruz:
Cela a toujours le problème que si toutes les valeurs de la fenêtre sont des NA, il y aura une division par zéro erreur.
la source
cumsum(c(1:3,NA,1:3))
cx <- c(0, cumsum(ifelse(is.na(x), 0, x)))
.Dans data.table 1.12.0 nouvelle
frollmean
fonction a été ajoutée pour le calcul rapide et exact de roulement moyen de manipulation avec soinNA
,NaN
et+Inf
, des-Inf
valeurs.Comme il n'y a pas d'exemple reproductible dans la question, il n'y a pas grand-chose d'autre à traiter ici.
Vous pouvez trouver plus d'informations sur
?frollmean
dans le manuel, également disponible en ligne à l'adresse?frollmean
.Exemples du manuel ci-dessous:
la source
Le
caTools
paquet a un roulement très rapide moyen / min / max / sd et quelques autres fonctions. J'ai seulement travaillé avecrunmean
etrunsd
et ils sont les plus rapides de tous les autres packages mentionnés à ce jour.la source
Vous pouvez utiliser
RcppRoll
pour des moyennes mobiles très rapides écrites en C ++. Appelez simplement laroll_mean
fonction. Les documents peuvent être trouvés ici .Sinon, cette boucle for (plus lente) devrait faire l'affaire:
la source
res = arr
. Ensuite, il y a une boucle qui itère à partir den
ou, le 15e élément, jusqu'à la fin du tableau. cela signifie que le tout premier sous-ensemble dont il prend la moyenne est celuiarr[1:15]
qui remplit la tacheres[15]
. Maintenant, je préfère définirres = rep(NA, length(arr))
plutôt queres = arr
si chaque élément deres[1:14]
NA est égal à plutôt qu'un nombre, où nous ne pouvions pas prendre une moyenne complète de 15 éléments.En fait,
RcppRoll
c'est très bien.Le code affiché par cantdutch cela doit être corrigé dans la quatrième ligne de la fenêtre être corrigé:
Une autre manière, qui gère les manquements, est donnée ici .
Une troisième façon, d'améliorer cantdutchce code pour calculer des moyennes partielles ou non, suit:
la source
Afin de compléter la réponse de cantdutchthis et Rodrigo Remedio ;
la source
Voici un exemple de code montrant comment calculer une moyenne mobile centrée et une moyenne mobile finale à l'aide de la
rollmean
fonction du package zoo .la source
Bien qu'un peu lent mais vous pouvez également utiliser zoo :: rollapply pour effectuer des calculs sur des matrices.
où x est l'ensemble de données, FUN = mean est la fonction; vous pouvez également le changer en min, max, sd, etc. et la largeur est la fenêtre déroulante.
la source
set.seed(123); x <- rnorm(1000); system.time(apply(embed(x, 5), 1, mean)); library(zoo); system.time(rollapply(x, 5, mean))
Sur ma machine, il est si rapide qu'il renvoie un temps de 0 seconde.On peut utiliser un
runner
package pour déplacer des fonctions. Dans ce cas,mean_run
fonction. Le problème,cummean
c'est qu'il ne gère pas lesNA
valeurs, mais lemean_run
fait.runner
Le package prend également en charge les séries chronologiques irrégulières et les fenêtres peuvent dépendre de la date:On peut également spécifier d'autres options comme
lag
, et rouler uniquementat
des index spécifiques. Plus d'informations dans la documentation des packages et des fonctions .la source
Le package slider peut être utilisé pour cela. Il a une interface qui a été spécialement conçue pour se sentir similaire à purrr. Il accepte n'importe quelle fonction arbitraire et peut renvoyer n'importe quel type de sortie. Les trames de données sont même itérées par ligne. Le site de pkgdown est ici .
La surcharge du curseur et de la table data.table
frollapply()
devrait être assez faible (beaucoup plus rapide que zoo).frollapply()
semble être un peu plus rapide pour cet exemple simple ici, mais notez qu'il ne prend qu'une entrée numérique et que la sortie doit être une valeur numérique scalaire. Les fonctions de curseur sont complètement génériques et vous pouvez renvoyer n'importe quel type de données.la source
la source