Ricerca Sociale con R

Una wiki per l'analisi dei dati con R

Strumenti Utente

Strumenti Sito


A breve mini webinar su YouTube , ad accesso libero. Info - email
r:analisi_monovariata:medie_mobili

Medie mobili

Un modo per ridurre le fluttuazioni (cicliche o casuali che siano) all'interno di una serie è calcolare medie mobili:

$$MA_{t,k} = \frac{y_{t-k} + y_{t-k-1}+\ldots+y_t+y_{t+1}+\ldots+y_{t+k-1}+y_{t+k}}{2k+1}$$

Per una media mobile a tre mesi, il valore di $k$ è 1. Per elementi pari:

$$MA_{t,k} = \frac{\frac{1}{2}y_{t-k} + y_{t-k-1}+\ldots+y_t+y_{t+1}+\ldots+y_{t+k-1}+\frac{1}{2}y_{t+k}}{2k}$$

Per una media mobile a dodici mesi, il valore di $k$ è dunque 6.

Con il calcolo delle medie mobili si perdono $2k$ osservazioni, $k$ all'inizio e $k$ alla fine della serie.

Pacchetto 'forecast'

La funzione ma() del pacchetto forecast richiede di indicare il valore di $2k$ (order).

Calcolando la media trimestrale della nostra serie AirPassengers, eliminiamo le fluttuazioni mensili e mettiamo in evidenza la stagionalità (i voli aumentano nel periodo estivo):

library(tidyverse)
library(forecast)
 
ma(AirPassengers, order = 3) %>% 
  autoplot()

Calcolando la media annuale, invece, restano le fluttuazioni cicliche di medio periodo:

ma(AirPassengers, 12)
          Jan      Feb      Mar      Apr      May      Jun
1949       NA       NA       NA       NA       NA       NA
1950 131.2500 133.0833 134.9167 136.4167 137.4167 138.7500
1951 157.1250 159.5417 161.8333 164.1250 166.6667 169.0833
1952 183.1250 186.2083 189.0417 191.2917 193.5833 195.8333
1953 215.8333 218.5000 220.9167 222.9167 224.0833 224.7083
...
ma(AirPassengers, 12) %>% 
  autoplot()

Pacchetto 'zoo'

Nel pacchetto zoo, troviamo diverse funzioni per il calcolo di indici mobili. Per la media mobile, usiamo la funzione rollmean().

rollmean(x, k, fill = if (na.pad) NA, na.pad = FALSE, 
  align = c("center", "left", "right"), ...)

Anche in questo caso, si indicherà come k l'intera finestra (quindi il valore $2k$).

E' inoltre possibile scegliere se calcolare la media mobile per il valore centrale (align = “center”, il default), per il primo (align = “left”) o per l'ultimo della finestra (align = “right”).

Dal momento che, come si è detto, il calcolo delle medie mobili comporta la perdita di $k$ osservazioni, all'inizio e alla fine della serie, con l'argomento fill possiamo scegliere come “riempire” queste osservazioni (solitamente si pone fill = NA).

Esempio:

library(zoo)
rollmean(AirPassengers, k = 12, fill = NA)
          Jan      Feb      Mar      Apr      May      Jun
1949       NA       NA       NA       NA       NA 126.6667
1950 132.1667 134.0000 135.8333 137.0000 137.8333 139.6667
1951 158.3333 160.7500 162.9167 165.3333 168.0000 170.1667
1952 184.4167 188.0000 190.0833 192.5000 194.6667 197.0000
1953 217.2500 219.7500 222.0833 223.7500 224.4167 225.0000
...

Come si vede, per $k$ pari, il risultato è diverso rispetto a quello della funzione ma().

Media geometrica mobile

Prima costruiamo la funzione per la media geometrica (vedi Media geometrica e Scrivere le proprie funzioni)

gmean <- function(x) exp(mean(log(x), na.rm = T))

E poi applichiamo la funzione rollapply in questo modo:

rollapply(x,            # serie
          3,            # k
          gmean,        # funzione 
          fill = NA)

Script di esempio

nome_file.R
library(tidyverse)
library(forecast)
 
ma(AirPassengers, order = 3) %>% 
  autoplot()
 
ma(AirPassengers, order = 12) 
 
library(zoo)
rollmean(AirPassengers, k = 12, fill = NA)
r/analisi_monovariata/medie_mobili.txt · Ultima modifica: 18/11/2020 10:03 da admin