Estoy tratando de usar R para calcular la media móvil sobre una serie de valores en una matriz. La búsqueda normal de la lista de correo R no ha sido muy útil. No parece haber un built-in function en R que me permita calcular los promedios móviles. ¿Alguno paquete proporciona uno? ¿O necesito escribir el mío?Cálculo de la media móvil
Respuesta
o simplemente puede calcularla usando el filtro, aquí está la función I utilizar:
ma <- function(x,n=5){filter(x,rep(1/n,n), sides=2)}
El paquete caTools
tiene una media/min/max/sd de rodadura muy rápida y algunas otras funciones. Solo he trabajado con runmean
y runsd
y son los más rápidos de los otros paquetes mencionados hasta la fecha.
todas las opciones enumeradas aquí son promedios móviles causales. si se requiere una versión no causal, entonces el paquete señal tiene algunas opciones.
No es muy útil simplemente nombrar un paquete; al menos dar los nombres de las funciones ... –
Puede usar RcppRoll
para promedios de movimiento muy rápidos escritos en C++. Simplemente llame a la función roll_mean
. Los documentos se pueden encontrar en here.
De lo contrario, este (más lento) bucle debería hacer el truco.
ma <- function(arr, n=15){
res = arr
for(i in n:length(arr)){
res[i] = mean(arr[(i-n):i])
}
res
}
¿Puede explicarme en detalle cómo funciona este algoritmo? Porque no puedo entender la idea –
El uso de cumsum
debe ser suficiente y eficiente. Asumiendo que tiene un vector x y desea una suma continua de n números
cx <- c(0,cumsum(x))
rsum <- (cx[(n+1):length(cx)] - cx[1:(length(cx) - n)])/n
Una desventaja de esta solución es que no puede manejar las pérdidas: 'cumsum (c (1: 3, NA, 1: 3))' – Jthorpe
De hecho RcppRoll
es muy bueno.
El código publicado por cantdutchthis debe ser corregido en la cuarta línea de la ventana se fijará:
ma <- function(arr, n=15){
res = arr
for(i in n:length(arr)){
res[i] = mean(arr[(i-n+1):i])
}
res
}
Otra forma, que se ocupa de missings, se da here.
Una tercera forma, la mejora de cantdutchthis código para calcular promedios parciales o no, de la siguiente manera:
ma <- function(x, n=2,parcial=TRUE){
res = x #set the first values
if (parcial==TRUE){
for(i in 1:length(x)){
t<-max(i-n+1,1)
res[i] = mean(x[t:i])
}
res
}else{
for(i in 1:length(x)){
t<-max(i-n+1,1)
res[i] = mean(x[t:i])
}
res[-c(seq(1,n-1,1))] #remove the n-1 first,i.e., res[c(-3,-4,...)]
}
}
Con el fin de complementar la respuesta de cantdutchthis y Rodrigo Remedio;
moving_fun <- function(x, w, FUN, ...) {
# x: a double vector
# w: the length of the window, i.e., the section of the vector selected to apply FUN
# FUN: a function that takes a vector and return a summarize value, e.g., mean, sum, etc.
# Given a double type vector apply a FUN over a moving window from left to the right,
# when a window boundary is not a legal section, i.e. lower_bound and i (upper bound)
# are not contained in the length of the vector, return a NA_real_
if (w < 1) {
stop("The length of the window 'w' must be greater than 0")
}
output <- x
for (i in 1:length(x)) {
# plus 1 because the index is inclusive with the upper_bound 'i'
lower_bound <- i - w + 1
if (lower_bound < 1) {
output[i] <- NA_real_
} else {
output[i] <- FUN(x[lower_bound:i, ...])
}
}
output
}
# example
v <- seq(1:10)
# compute a MA(2)
moving_fun(v, 2, mean)
# compute moving sum of two periods
moving_fun(v, 2, sum)
- 1. Cálculo de la media móvil en C++
- 2. C++ Cálculo eficiente de una media móvil
- 3. media móvil exponencial de Java
- 4. media móvil ponderada con numpy.convolve
- 5. Calculando la media móvil ponderada en el tiempo
- 6. Octava serie de tiempo Media móvil
- 7. Cálculo de una media diaria en I
- 8. Calculando una media móvil en F #
- 9. ¿Cómo calculo una media móvil usando MySQL?
- 10. aplicando la media móvil por grupo en R
- 11. Cómo calcular la media móvil acumulativa en Python/SQLAlchemy/Flask
- 12. ¿Hay una función en java para obtener una media móvil?
- 13. ¿Cómo calcular una media móvil exponencial en postgres?
- 14. ¿cómo puedo calcular una media móvil ponderada utilizando pandas
- 15. Cálculo del rango móvil en SQL Server (sin matrices)
- 16. Cálculo de la media de los valores en las tablas usando fórmulas [R]
- 17. Cálculo de una movimiento máximo
- 18. Media = Todos frente a Media = Pantalla
- 19. Cómo encontrar la media máxima
- 20. ¿Cómo se usa una media móvil para filtrar los valores del acelerómetro en iPhone OS
- 21. ¿Cuál es la diferencia entre la media perezosa y la media inmediata en el acumulador Boost?
- 22. Calcular la media mensual de TS objeto
- 23. Construir en la función para el cálculo de la covarianza
- 24. ¿Cómo apuntar a un tamaño de pantalla específico usando @media media query?
- 25. @media media query y ASP.NET MVC navaja sintaxis razor
- 26. awk calcular la media o cero
- 27. ¿Qué riesgo presenta la Reflexión? (Confianza media)
- 28. ¿Cómo calcular la media ponderada en R?
- 29. ¿Qué es la confianza media en Asp.net?
- 30. UIModalTransitionStylePartialCurl media página
Debo señalar que "lados = 2" puede ser una opción importante en casos de uso de muchas personas que no quieren pasar por alto. Si solo desea información final en su promedio móvil, debe usar lados = 1. – evanrsparks
Algunos años después, pero dplyr ahora tiene una función de filtro, si tiene este paquete cargado use 'stats :: filter' – blmoore
' sides = 2' es equivalente a align = "center" para el zoo :: rollmean o RcppRoll :: roll_mean . 'sides = 1' es equivalente a la alineación" derecha ".No veo una manera de hacer alineación "izquierda" o calcular con datos "parciales" (2 o más valores)? –