2010-12-11 13 views
5

come ottenere una "media mobile" a due lati che è una funzione che calcola la media di n numeri da destra e sinistra di un vettore e fornisce pesi in base alla loro distanza dal valore centrale?media mobile a due lati?

Ho provato a utilizzare TTR ma le sue medie mobili funzionano solo da sinistra a destra e impostano i valori più a sinistra come NA. Quindi non posso usare quel vettore levigato come input per smooth.spline

risposta

8

Nel pacchetto zoo rollmean e rollapply hanno argomenti che permettono numerose varianti.

library(zoo) 
x <- seq(10)^2 

# no NAs at end 
rollmean(x, 3) 

# NAs at ends 
rollmean(x, 3, na.pad = TRUE) 

# weighted mean 
rollapply(zoo(x), 3, function(x) c(1, 2, 1) %*% x/4) 

# at ends take means of less than 3 points - needs devel version 
# partial= is in development and at this point must use na.rm = TRUE to use partial 
source("http://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/zoo/R/rollapply.R?revision=802&root=zoo") 
rollapply(zoo(x), 3, mean, partial = TRUE, na.rm = TRUE) 

EDIT:

Nota che da quando questo è stato scritto la versione di sviluppo di zoo è stato modificato in modo che invece di scrivere partial = TRUE uno scrive regola = "parziale" o rule = 3. Il problema era che come nuove regole di fine sono state aggiunte alla versione di sviluppo (ci sono ora 3 e una quarta verrà aggiunta prima della sua versione) con un argomento separato per ciascuna di esse ingombra l'interfaccia utente. Anche rule è più coerente con lo approx nel core di R. Infatti, rule=1 e rule=2 avranno lo stesso significato in rollapply e in approx (dal nucleo di R) per una maggiore coerenza e facilità d'uso. Le parentesi intorno a mean nell'esempio seguente sono attualmente necessarie nella versione di sviluppo per impedirgli di chiamare rollmean, dove rule="partial" non è ancora stato implementato, ma la necessità di farlo sarà eliminata dal momento in cui è stata rilasciata ufficialmente.

source("http://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/zoo/R/rollapply.R?revision=815&root=zoo") 
rollapply(zoo(x), 3, (mean), rule = "partial") 
+0

Ma perché l'output di rollmean è sempre un elemento più breve di itput? – rsk82

2

Si potrebbe provare kernel insieme a kernapply (ci sono alcuni esempi verso la fine della prima pagina).

5

sguardo alla funzione filter(), e in particolare l'argomento sides:

filter     package:stats    R Documentation 

Linear Filtering on a Time Series 

Description: 

    Applies linear filtering to a univariate time series or to each 
    series separately of a multivariate time series. 

Usage: 

    filter(x, filter, method = c("convolution", "recursive"), 
      sides = 2, circular = FALSE, init) 

Arguments: 
[...] 
    sides: for convolution filters only. If ‘sides=1’ the filter 
      coefficients are for past values only; if ‘sides=2’ they are 
      centred around lag 0. In this case the length of the filter 
      should be odd, but if it is even, more of the filter is 
      forward in time than backward. 
Problemi correlati