È questo un metodo appropriato per testare gli effetti stagionali nei dati sul conteggio dei suicidi?


24

Ho 17 anni (1995-2011) di dati relativi al certificato di morte relativi a decessi suicidi per uno stato negli Stati Uniti. C'è molta mitologia là fuori sui suicidi e sui mesi / stagioni, molti dei quali contraddittori, e della letteratura I ' ho rivisto, non ho un chiaro senso dei metodi utilizzati o la fiducia nei risultati.

Quindi ho deciso di vedere se riesco a determinare se i suicidi hanno più o meno probabilità di verificarsi in un dato mese all'interno del mio set di dati. Tutte le mie analisi sono fatte in R.

Il numero totale di suicidi nei dati è di 13.909.

Se guardi l'anno con il minor numero di suicidi, si verificano in 309/365 giorni (85%). Se guardi l'anno con il maggior numero di suicidi, si verificano in 339/365 giorni (93%).

Quindi ci sono un buon numero di giorni ogni anno senza suicidi. Tuttavia, se aggregati in tutti i 17 anni, ci sono suicidi in ogni giorno dell'anno, incluso il 29 febbraio (sebbene solo 5 quando la media è 38).

inserisci qui la descrizione dell'immagine

Il semplice sommare il numero di suicidi in ogni giorno dell'anno non indica una chiara stagionalità (ai miei occhi).

Aggregati a livello mensile, i suicidi medi al mese vanno da:

(m = 65, sd = 7.4, a m = 72, sd = 11.1)

Il mio primo approccio è stato quello di aggregare il set di dati per mese per tutti gli anni e fare un test chi-quadro dopo aver calcolato le probabilità attese per l'ipotesi nulla, che non vi fosse alcuna varianza sistematica nella conta dei suicidi per mese. Ho calcolato le probabilità per ogni mese tenendo conto del numero di giorni (e adeguando febbraio per gli anni bisestili).

I risultati del chi-quadrato non hanno indicato variazioni significative di mese:

# So does the sample match  expected values?
chisq.test(monthDat$suicideCounts, p=monthlyProb)
# Yes, X-squared = 12.7048, df = 11, p-value = 0.3131

L'immagine seguente indica i conteggi totali al mese. Le linee rosse orizzontali sono posizionate ai valori previsti rispettivamente per febbraio, 30 giorni e 31 giorni. Coerentemente con il test chi-quadro, nessun mese è al di fuori dell'intervallo di confidenza del 95% per i conteggi previsti. inserisci qui la descrizione dell'immagine

Pensavo di aver finito fino a quando non ho iniziato a indagare sui dati delle serie storiche. Come immagino molte persone, ho iniziato con il metodo di decomposizione stagionale non parametrico usando la stlfunzione nel pacchetto stats.

Per creare i dati delle serie temporali, ho iniziato con i dati mensili aggregati:

suicideByMonthTs <- ts(suicideByMonth$monthlySuicideCount, start=c(1995, 1), end=c(2011, 12), frequency=12) 

# Plot the monthly suicide count, note the trend, but seasonality?
plot(suicideByMonthTs, xlab="Year",
  ylab="Annual  monthly  suicides")

inserisci qui la descrizione dell'immagine

     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1995  62  47  55  74  71  70  67  69  61  76  68  68
1996  64  69  68  53  72  73  62  63  64  72  55  61
1997  71  61  64  63  60  64  67  50  48  49  59  72
1998  67  54  72  69  78  45  59  53  48  65  64  44
1999  69  64  65  58  73  83  70  73  58  75  71  58
2000  60  54  67  59  54  69  62  60  58  61  68  56
2001  67  60  54  57  51  61  67  63  55  70  54  55
2002  65  68  65  72  79  72  64  70  59  66  63  66
2003  69  50  59  67  73  77  64  66  71  68  59  69
2004  68  61  66  62  69  84  73  62  71  64  59  70
2005  67  53  76  65  77  68  65  60  68  71  60  79
2006  65  54  65  68  69  68  81  64  69  71  67  67
2007  77  63  61  78  73  69  92  68  72  61  65  77
2008  67  73  81  73  66  63  96  71  75  74  81  63
2009  80  68  76  65  82  69  74  88  80  86  78  76
2010  80  77  82  80  77  70  81  89  91  82  71  73
2011  93  64  87  75 101  89  87  78 106  84  64  71

E poi ha eseguito la stl()decomposizione

# Seasonal decomposition
suicideByMonthFit <- stl(suicideByMonthTs, s.window="periodic")
plot(suicideByMonthFit)

inserisci qui la descrizione dell'immagine

A questo punto mi sono preoccupato perché mi sembra che ci sia una componente stagionale e una tendenza. Dopo molte ricerche su Internet, ho deciso di seguire le istruzioni di Rob Hyndman e George Athanasopoulos come indicato nel loro testo online "Previsioni: principi e pratica", in particolare per applicare un modello ARIMA stagionale.

Ho usato adf.test()e kpss.test()per valutare la stazionarietà e ho ottenuto risultati contrastanti. Entrambi hanno respinto l'ipotesi nulla (notando che testano l'ipotesi opposta).

adfResults <- adf.test(suicideByMonthTs, alternative = "stationary") # The p < .05 value 
adfResults

    Augmented Dickey-Fuller Test

data:  suicideByMonthTs
Dickey-Fuller = -4.5033, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary

kpssResults <- kpss.test(suicideByMonthTs)
kpssResults

    KPSS Test for Level Stationarity

data:  suicideByMonthTs
KPSS Level = 2.9954, Truncation lag parameter = 3, p-value = 0.01

Ho quindi usato l'algoritmo nel libro per vedere se potevo determinare la quantità di differenziazione che doveva essere fatta sia per la tendenza che per la stagione. Ho finito con nd = 1, ns = 0.

Ho quindi corso auto.arima, che ha scelto un modello che aveva sia una tendenza che una componente stagionale insieme a una costante di tipo "deriva".

# Extract the best model, it takes time as I've turned off the shortcuts (results differ with it on)
bestFit <- auto.arima(suicideByMonthTs, stepwise=FALSE, approximation=FALSE)
plot(theForecast <- forecast(bestFit, h=12))
theForecast

inserisci qui la descrizione dell'immagine

> summary(bestFit)
Series: suicideByMonthFromMonthTs 
ARIMA(0,1,1)(1,0,1)[12] with drift         

Coefficients:
          ma1    sar1     sma1   drift
      -0.9299  0.8930  -0.7728  0.0921
s.e.   0.0278  0.1123   0.1621  0.0700

sigma^2 estimated as 64.95:  log likelihood=-709.55
AIC=1429.1   AICc=1429.4   BIC=1445.67

Training set error measures:
                    ME    RMSE     MAE       MPE     MAPE     MASE       ACF1
Training set 0.2753657 8.01942 6.32144 -1.045278 9.512259 0.707026 0.03813434

Infine, ho esaminato i residui dall'adattamento e se lo capisco correttamente, poiché tutti i valori rientrano nei limiti di soglia, si comportano come rumore bianco e quindi il modello è abbastanza ragionevole. Ho eseguito un test portmanteau come descritto nel testo, che aveva un valore ap ben superiore a 0,05, ma non sono sicuro di avere i parametri corretti.

Acf(residuals(bestFit))

inserisci qui la descrizione dell'immagine

Box.test(residuals(bestFit), lag=12, fitdf=4, type="Ljung")

    Box-Ljung test

data:  residuals(bestFit)
X-squared = 7.5201, df = 8, p-value = 0.4817

Dopo essere tornato a leggere di nuovo il capitolo sulla modellazione degli arima, ora mi rendo conto che auto.arimaha scelto di modellare tendenza e stagione. E sto anche comprendendo che la previsione non è specificamente l'analisi che probabilmente dovrei fare. Voglio sapere se un mese specifico (o più generalmente un periodo dell'anno) deve essere contrassegnato come mese ad alto rischio. Sembra che gli strumenti nella letteratura sulle previsioni siano altamente pertinenti, ma forse non i migliori per la mia domanda. Qualsiasi input è molto apprezzato.

Sto pubblicando un collegamento a un file CSV che contiene i conteggi giornalieri. Il file è simile al seguente:

head(suicideByDay)

        date year month day_of_month t count
1 1995-01-01 1995    01           01 1     2
2 1995-01-03 1995    01           03 2     1
3 1995-01-04 1995    01           04 3     3
4 1995-01-05 1995    01           05 4     2
5 1995-01-06 1995    01           06 5     3
6 1995-01-07 1995    01           07 6     2

daily_suicide_data.csv

Il conteggio è il numero di suicidi avvenuti quel giorno. "t" è una sequenza numerica da 1 al numero totale di giorni nella tabella (5533).

Ho preso nota dei commenti qui sotto e ho pensato a due cose legate alla modellazione del suicidio e delle stagioni. In primo luogo, per quanto riguarda la mia domanda, i mesi sono semplicemente dei proxy per segnare il cambio di stagione, non mi interessa se un determinato mese o non è diverso dagli altri (che ovviamente è una domanda interessante, ma non è quello che ho deciso di fare indagare). Quindi, penso che abbia senso equalizzare i mesi semplicemente usando i primi 28 giorni di tutti i mesi. Quando lo fai, ottieni un adattamento leggermente peggiore, che sto interpretando come ulteriori prove di una mancanza di stagionalità. Nell'output di seguito, il primo adattamento è una riproduzione da una risposta di seguito che utilizza i mesi con il loro numero reale di giorni, seguito da un set di dati suicidioByShortMonthin cui i conteggi dei suicidi sono stati calcolati dai primi 28 giorni di tutti i mesi. Sono interessato a ciò che la gente pensa se questo adattamento è una buona idea, non necessario o dannoso?

> summary(seasonFit)

Call:
glm(formula = count ~ t + days_in_month + cos(2 * pi * t/12) + 
    sin(2 * pi * t/12), family = "poisson", data = suicideByMonth)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4782  -0.7095  -0.0544   0.6471   3.2236  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)    
(Intercept)         2.8662459  0.3382020   8.475  < 2e-16 ***
t                   0.0013711  0.0001444   9.493  < 2e-16 ***
days_in_month       0.0397990  0.0110877   3.589 0.000331 ***
cos(2 * pi * t/12) -0.0299170  0.0120295  -2.487 0.012884 *  
sin(2 * pi * t/12)  0.0026999  0.0123930   0.218 0.827541    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 302.67  on 203  degrees of freedom
Residual deviance: 190.37  on 199  degrees of freedom
AIC: 1434.9

Number of Fisher Scoring iterations: 4

> summary(shortSeasonFit)

Call:
glm(formula = shortMonthCount ~ t + cos(2 * pi * t/12) + sin(2 * 
    pi * t/12), family = "poisson", data = suicideByShortMonth)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-3.2414  -0.7588  -0.0710   0.7170   3.3074  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)    
(Intercept)         4.0022084  0.0182211 219.647   <2e-16 ***
t                   0.0013738  0.0001501   9.153   <2e-16 ***
cos(2 * pi * t/12) -0.0281767  0.0124693  -2.260   0.0238 *  
sin(2 * pi * t/12)  0.0143912  0.0124712   1.154   0.2485    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 295.41  on 203  degrees of freedom
Residual deviance: 205.30  on 200  degrees of freedom
AIC: 1432

Number of Fisher Scoring iterations: 4

La seconda cosa che ho approfondito è il problema dell'uso del mese come proxy per la stagione. Forse un indicatore migliore della stagione è il numero di ore di luce che un'area riceve. Questi dati provengono da uno stato settentrionale che presenta notevoli variazioni alla luce del giorno. Di seguito è riportato un grafico della luce del giorno dell'anno 2002.

inserisci qui la descrizione dell'immagine

Quando uso questi dati anziché il mese dell'anno, l'effetto è ancora significativo, ma l'effetto è molto, molto piccolo. La devianza residua è molto più grande dei modelli sopra. Se le ore di luce sono un modello migliore per le stagioni e la vestibilità non è altrettanto buona, si tratta di ulteriori prove di effetti stagionali molto piccoli?

> summary(daylightFit)

Call:
glm(formula = aggregatedDailyCount ~ t + daylightMinutes, family = "poisson", 
    data = aggregatedDailyNoLeap)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-3.0003  -0.6684  -0.0407   0.5930   3.8269  

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)      3.545e+00  4.759e-02  74.493   <2e-16 ***
t               -5.230e-05  8.216e-05  -0.637   0.5244    
daylightMinutes  1.418e-04  5.720e-05   2.479   0.0132 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 380.22  on 364  degrees of freedom
Residual deviance: 373.01  on 362  degrees of freedom
AIC: 2375

Number of Fisher Scoring iterations: 4

Sto pubblicando le ore di luce nel caso in cui qualcuno voglia giocare con questo. Si noti che questo non è un anno bisestile, quindi se si desidera inserire il verbale per gli anni bisestili, estrapolare o recuperare i dati.

state.daylight.2002.csv

[ Modifica per aggiungere la trama dalla risposta eliminata (speriamo che non mi dispiaccia spostare la trama nella risposta eliminata qui alla domanda. Svannoy, se non vuoi che questa venga aggiunta dopo tutto, puoi ripristinarla)]

inserisci qui la descrizione dell'immagine


1
La formulazione "uno dei nostri 50 stati" implica che tutti i lettori appartengono agli Stati Uniti. Manifestamente anche molti alieni si nascondono qui.
Nick Cox,

1
Proviene da un set di dati pubblico? Potresti rendere disponibili i dati settimana per settimana o anche giorno per giorno?
Elvis,

1
@Elvis - Ho pubblicato un link ai dati del conteggio giornaliero. I dati provengono da certificati di morte che sono "registri pubblici" ma che richiedono un processo per ottenere; tuttavia, i dati di conteggio aggregati no. PS: ho provato io stesso il collegamento e ha funzionato, ma non ho mai postato in una cartella dropbox pubblica in questo modo prima, quindi per favore fatemi sapere se il collegamento non funziona.
svannoy,

1
Poiché i tuoi dati sono conteggi, mi aspetto che la varianza sia correlata alla media. I soliti modelli di serie storiche non tengono conto di ciò (tuttavia, potresti provare a dire una trasformazione , forse un Freeman-Tukey , per esempio), oppure potresti guardare un modello di serie temporale progettato per i dati di conteggio. (Se non lo fai, potrebbe non essere un grosso problema dal momento che il numero varia solo per un fattore di circa due.)
Glen_b -Restate Monica

1
ytμtVar(yt)=μt

Risposte:


13

Che dire di una regressione di Poisson?

Ho creato un frame di dati contenente i tuoi dati, oltre a un indice tper l'ora (in mesi) e una variabile monthdaysper il numero di giorni in ogni mese.

T <- read.table("suicide.txt", header=TRUE)
U <- data.frame( year = as.numeric(rep(rownames(T),each=12)), 
         month = rep(colnames(T),nrow(T)), 
         t = seq(0, length = nrow(T)*ncol(T)), 
         suicides = as.vector(t(T)))
U$monthdays <- c(31,28,31,30,31,30,31,31,30,31,30,31)
U$monthdays[ !(U$year %% 4) & U$month == "Feb" ] <- 29

Quindi sembra così:

> head(U,14)
   year month  t suicides monthdays
1  1995   Jan  0       62        31
2  1995   Feb  1       47        28
3  1995   Mar  2       55        31
4  1995   Apr  3       74        30
5  1995   May  4       71        31
6  1995   Jun  5       70        30
7  1995   Jul  6       67        31
8  1995   Aug  7       69        31
9  1995   Sep  8       61        30
10 1995   Oct  9       76        31
11 1995   Nov 10       68        30
12 1995   Dec 11       68        31
13 1996   Jan 12       64        31
14 1996   Feb 13       69        29

Ora confrontiamo un modello con un effetto temporale e un numero di giorni con un modello in cui aggiungiamo un effetto mensile:

> a0 <- glm( suicides ~ t + monthdays, family="poisson", data = U )
> a1 <- glm( suicides ~ t + monthdays + month, family="poisson", data = U )

Ecco il riassunto del modello "piccolo":

> summary(a0)

Call:
glm(formula = suicides ~ t + monthdays, family = "poisson", data = U)

Deviance Residuals:
    Min       1Q   Median       3Q      Max
-2.7163  -0.6865  -0.1161   0.6363   3.2104

Coefficients:
             Estimate Std. Error z value Pr(>|z|)
(Intercept) 2.8060135  0.3259116   8.610  < 2e-16 ***
t           0.0013650  0.0001443   9.461  < 2e-16 ***
monthdays   0.0418509  0.0106874   3.916 9.01e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 302.67  on 203  degrees of freedom
Residual deviance: 196.64  on 201  degrees of freedom
AIC: 1437.2

Number of Fisher Scoring iterations: 4

Puoi vedere che le due variabili hanno effetti marginali in gran parte significativi. Ora guarda il modello più grande:

> summary(a1)

Call:
glm(formula = suicides ~ t + monthdays + month, family = "poisson",
    data = U)

Deviance Residuals:
     Min        1Q    Median        3Q       Max
-2.56164  -0.72363  -0.05581   0.58897   3.09423

Coefficients:
              Estimate Std. Error z value Pr(>|z|)
(Intercept)  1.4559200  2.1586699   0.674    0.500
t            0.0013810  0.0001446   9.550   <2e-16 ***
monthdays    0.0869293  0.0719304   1.209    0.227
monthAug    -0.0845759  0.0832327  -1.016    0.310
monthDec    -0.1094669  0.0833577  -1.313    0.189
monthFeb     0.0657800  0.1331944   0.494    0.621
monthJan    -0.0372652  0.0830087  -0.449    0.653
monthJul    -0.0125179  0.0828694  -0.151    0.880
monthJun     0.0452746  0.0414287   1.093    0.274
monthMar    -0.0638177  0.0831378  -0.768    0.443
monthMay    -0.0146418  0.0828840  -0.177    0.860
monthNov    -0.0381897  0.0422365  -0.904    0.366
monthOct    -0.0463416  0.0830329  -0.558    0.577
monthSep     0.0070567  0.0417829   0.169    0.866
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 302.67  on 203  degrees of freedom
Residual deviance: 182.72  on 190  degrees of freedom
AIC: 1445.3

Number of Fisher Scoring iterations: 4

Bene, ovviamente il monthdays effetto svanisce; può essere stimato solo grazie agli anni bisestili !! Mantenerlo nel modello (e tenendo conto degli anni bisestili) consente di utilizzare le deviazioni residue per confrontare i due modelli.

> anova(a0, a1, test="Chisq")
Analysis of Deviance Table

Model 1: suicides ~ t + monthdays
Model 2: suicides ~ t + monthdays + month
  Resid. Df Resid. Dev Df Deviance Pr(>Chi)
1       201     196.65
2       190     182.72 11   13.928    0.237

cos(2πt12)peccato(2πt12)

> a2 <- glm( suicides ~ t + monthdays + cos(2*pi*t/12) + sin(2*pi*t/12),
             family="poisson", data = U )
> summary(a2)

Call:
glm(formula = suicides ~ t + monthdays + cos(2 * pi * t/12) +
    sin(2 * pi * t/12), family = "poisson", data = U)

Deviance Residuals:
    Min       1Q   Median       3Q      Max
-2.4782  -0.7095  -0.0544   0.6471   3.2236

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)
(Intercept)         2.8676170  0.3381954   8.479  < 2e-16 ***
t                   0.0013711  0.0001444   9.493  < 2e-16 ***
monthdays           0.0397990  0.0110877   3.589 0.000331 ***
cos(2 * pi * t/12) -0.0245589  0.0122658  -2.002 0.045261 *
sin(2 * pi * t/12)  0.0172967  0.0121591   1.423 0.154874
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 302.67  on 203  degrees of freedom
Residual deviance: 190.37  on 199  degrees of freedom
AIC: 1434.9

Number of Fisher Scoring iterations: 4

Ora confrontalo con il modello null:

> anova(a0, a2, test="Chisq")
Analysis of Deviance Table

Model 1: suicides ~ t + monthdays
Model 2: suicides ~ t + monthdays + cos(2 * pi * t/12) + sin(2 * pi *
    t/12)
  Resid. Df Resid. Dev Df Deviance Pr(>Chi)
1       201     196.65                   
2       199     190.38  2   6.2698   0.0435 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Quindi, si può sicuramente dire che questo suggerisce un effetto stagionale ...


2
p

2
Sono totalmente d'accordo, è quello che ho insegnato :) "Si può sicuramente dire che questo suggerisce un effetto"; e non "C'è un effetto"! Ciò che ritengo interessante è questa trasformazione trigonometrica, è molto naturale e non capisco perché non venga vista più spesso. Ma questo è solo un punto di partenza ... bootstrap, valutazione del modello ... molto da fare.
Elvis

1
Nessun problema! Mio male, quindi, non sono stato in grado di rilevare la battuta. :)
usεr11852 dice Reinstate Monic l'

2
+1. Poisson incontra Fourier .... Penso che gli economisti e alcuni altri enfatizzino le variabili dell'indicatore perché la stagionalità può essere acuta, ma l'approccio trigonometrico spesso aiuta.
Nick Cox,

2
Infatti. Una recensione del tutorial che ho scritto è accessibile all'indirizzo stata-journal.com/article.html?article=st0116
Nick Cox

8

Un test chi-quadro è un buon approccio come vista preliminare alla tua domanda.

La stldecomposizione può essere fuorviante come strumento per verificare la presenza di stagionalità. Questa procedura riesce a restituire un modello stagionale stabile anche se un rumore bianco (segnale casuale senza struttura) viene passato come input. Prova ad esempio:

plot(stl(ts(rnorm(144), frequency=12), s.window="periodic"))

Anche esaminare gli ordini scelti da una procedura automatica di selezione del modello ARIMA è un po 'rischioso poiché un modello ARIMA stagionale non implica sempre la stagionalità (per i dettagli vedere questa discussione ). In questo caso, il modello scelto genera cicli stagionali e il commento di @RichardHardy è ragionevole, tuttavia, è necessario un ulteriore approfondimento per concludere che i suicidi sono guidati da un modello stagionale.

Di seguito, riassumo alcuni risultati basati sull'analisi delle serie mensili che hai pubblicato. Questa è la componente stagionale stimata sul modello base strutturale delle serie storiche:

require(stsm)
m <- stsm.model(model = "llm+seas", y = x)
fit <- stsmFit(m, stsm.method = "maxlik.td.scoring")
plot(tsSmooth(fit)$states[,2], ylab = "")
mtext(text = "seasonal component", side = 3, adj = 0, font = 2)

componente stagionale stimata

Un componente simile è stato estratto utilizzando il software TRAMO-SEATS con opzioni predefinite. Possiamo vedere che il modello stagionale stimato non è stabile nel tempo e, quindi, non supporta l'ipotesi di un modello ricorrente nel numero di suicidi tra mesi durante il periodo di campionamento. Eseguendo il software X-13ARIMA-SEATS con opzioni predefinite, il test combinato per la stagionalità ha concluso che la stagionalità identificabile non è presente.

Modifica (vedi questa risposta e il mio commento qui sotto per una definizione di stagionalità identificabile ).

Data la natura dei tuoi dati, varrebbe la pena integrare questa analisi basata sui metodi delle serie temporali con un modello per i dati di conteggio (ad esempio il modello di Poisson) e testare il significato della stagionalità in quel modello. L'aggiunta dei dati di conteggio dei tag alla domanda può comportare ulteriori visualizzazioni e potenziali risposte in questa direzione.


Grazie @javiacalle, esaminerò i metodi che suggerisci. Posso chiederti della tua conclusione del grafico che hai pubblicato, è il fatto che l'ampiezza aumenta con il passare degli anni che è la base del tuo commento, "possiamo vedere che il modello stagionale stimato non è stabile nel tempo", o lo fa includere l'osservazione più sottile che la forma di ciascun picco è leggermente diversa? Sono un presupposto il primo, ma sappiamo dove ci portano le ipotesi.
svannoy,

2
χ2

@svannoy La conclusione principale basata sui metodi delle serie temporali utilizzati nella mia risposta è che non esiste un chiaro modello stagionale nei dati di esempio. Nonostante i cicli stagionali spieghino parte della variabilità dei dati, un modello stagionale non può essere identificato in modo affidabile poiché è oscurato da un alto grado di fluttuazioni irregolari (questo potrebbe anche essere verificato visualizzando la funzione di guadagno del modello ARIMA scelto mostrato nella domanda) .
javlacalle,

@oDDsKooL Ho anche fatto il test chi-square il giorno della settimana, sabato / domenica sono un po 'al di sotto delle aspettative e lunedì / martedì sono appena sopra ....
svannoy

6

Come notato nel mio commento, questo è un problema molto interessante. Rilevare la stagionalità non è solo un esercizio statistico. Un approccio ragionevole sarebbe quello di consultare la teoria e gli esperti come:

  • Psicologo
  • Psichiatra
  • Sociologo

su questo problema per capire "perché" ci sarebbe stagionalità per integrare l'analisi dei dati. Per quanto riguarda i dati, ho usato un metodo di decomposizione eccellente chiamato modello di componenti non osservati (UCM) che è una forma di metodo dello spazio degli stati. Vedi anche questo articolo molto accessibile di Koopman. Il mio approccio è simile a @Javlacalle. Non solo fornisce uno strumento per decomporre i dati delle serie temporali, ma valuta obiettivamente la presenza o l'assenza di stagionalità tramite test di significatività. Non sono un grande fan dei test di significatività su dati non sperimentali, ma non conosco nessun'altra procedura che potresti testare le tue ipotesi sulla presenza / assenza di stagionalità su dati di serie temporali.

Molti ignorano, ma una caratteristica molto importante che si vorrebbe capire è il tipo di stagionalità:

  1. Stocastico: cambiamenti casuali e difficili da prevedere
  2. Deterministico - non cambia, perfettamente prevedibile. È possibile utilizzare il manichino o la trigonometria (sin / cos ecc.) Per modellare

Per dati di serie temporali lunghi come i tuoi, è possibile che la stagionalità sia cambiata nel tempo. Ancora una volta UCM è l'unico approccio che conosco in grado di rilevare queste stagionalità stocastiche / deterministiche. UCM può scomporre il problema nei seguenti "componenti":

Time Series Data = level + Slope + Seasonality + Cycle + Causal + Error(Noise).

Puoi anche verificare se il livello, la pendenza, il ciclo sono deterministici o stocastici. Si prega di notare che level + slope = trend. Di seguito vi presento alcune analisi sui vostri dati usando UCM. Ho usato SAS per fare l'analisi.

data input;
format date mmddyy10.;
date = intnx( 'month', '1jan1995'd, _n_-1 );
      input deaths@@;
datalines;
62    47  55  74  71  70  67  69  61  76  68  68
64    69  68  53  72  73  62  63  64  72  55  61
71    61  64  63  60  64  67  50  48  49  59  72
67    54  72  69  78  45  59  53  48  65  64  44
69    64  65  58  73  83  70  73  58  75  71  58
60    54  67  59  54  69  62  60  58  61  68  56
67    60  54  57  51  61  67  63  55  70  54  55
65    68  65  72  79  72  64  70  59  66  63  66
69    50  59  67  73  77  64  66  71  68  59  69
68    61  66  62  69  84  73  62  71  64  59  70
67    53  76  65  77  68  65  60  68  71  60  79
65    54  65  68  69  68  81  64  69  71  67  67
77    63  61  78  73  69  92  68  72  61  65  77
67    73  81  73  66  63  96  71  75  74  81  63
80    68  76  65  82  69  74  88  80  86  78  76
80    77  82  80  77  70  81  89  91  82  71  73
93    64  87  75  101 89  87  78  106 84  64  71
;
run;

ods graphics on;
 proc ucm data = input plots=all; 
      id date interval = month; 
      model deaths ; 
      irregular ; 
      level checkbreak; 
      season length = 12 type=trig var = 0 noest; * Note I have used trigonometry to model seasonality;
   run;

   ods graphics off;

Dopo diverse iterazioni che considerano componenti e combinazioni diverse, ho concluso con un modello parsimonioso della seguente forma:

C'è un livello stocastico + stagionalità deterministica + alcuni valori anomali e i dati non hanno altre caratteristiche rilevabili.

inserisci qui la descrizione dell'immagine

Di seguito è riportata l'analisi della significatività di vari componenti. Si noti che ho usato la trigonometria (che è sin / cos nella dichiarazione di stagionalità in PROC UCM) simile a @Elvis e @Nick Cox. Potresti anche usare la codifica fittizia in UCM e quando ho testato entrambi ho dato risultati simili. Vedere questa documentazione per le differenze tra i due modi per modellare la stagionalità in SAS.

inserisci qui la descrizione dell'immagine

Come mostrato sopra, si hanno valori anomali: due impulsi e uno spostamento di livello nel 2009 (la bolla economia / alloggiamento ha avuto un ruolo dopo il 2009 ??) che potrebbe essere spiegata da un'ulteriore analisi approfondita dell'immersione. Una buona caratteristica dell'uso Proc UCMè che fornisce un eccellente output grafico.

Di seguito è riportata la stagionalità e una trama combinata di tendenza e stagionalità. Tutto ciò che resta è il rumore .

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Un test diagnostico più importante se si desidera utilizzare i valori p e il test di significatività è verificare se i residui sono senza pattern e normalmente distribuiti, che è soddisfatto nel modello sopra usando UCM e come mostrato di seguito nei grafici diagnostici residui come acf / pacf e altri.

inserisci qui la descrizione dell'immagine

Conclusione : sulla base dell'analisi dei dati utilizzando UCM e test di significatività, i dati sembrano avere stagionalità e vediamo un alto numero di decessi nei mesi estivi di maggio / giugno / luglio e il più basso nei mesi invernali di dicembre e febbraio.

Ulteriori considerazioni : considerare anche il significato pratico dell'entità delle variazioni stagionali. Per negare argomenti controfattuali, consultare gli esperti del dominio per integrare e convalidare ulteriormente le vostre ipotesi.

Non sto affatto dicendo che questo è l'unico approccio per risolvere questo problema. La caratteristica che mi piace di UCM è che ti consente di modellare esplicitamente tutte le funzionalità delle serie temporali ed è anche altamente visivo.


Grazie per questa risposta e per i commenti interessanti. Non conosco UCM, sembra molto interessante, proverò a tenerlo a mente ...
Elvis

(+1) Analisi interessante. Sarei ancora cauto nel concludere la presenza di un significativo modello stagionale deterministico, ma i tuoi risultati richiedono uno sguardo più da vicino a questa possibilità. Il test di Canova e Hansen per la stabilità stagionale potrebbe essere utile, è descritto ad esempio qui .
javlacalle,

gretlπ/6

1
+1. Molti commenti interessanti e utili. Alla tua lista di psicologi, psichiatri, sociologi potrebbe essere aggiunto meteorologo / climatologo. Una persona del genere vorrebbe aggiungere che non esistono due anni identici nei cicli di pioggia e temperatura. Avrei indovinato rozzamente una maggiore depressione in inverno (lunghezze del giorno più brevi, ecc.), Ma così tanto per un'ipotesi dati alcuni dati.
Nick Cox,

Grazie @forecaster, questo aggiunge molto al mio apprendimento. Sono uno psicologo, con una laurea in sanità pubblica. Aggiungerei epidemiologo alla tua lista. Come ho detto all'inizio, c'è molta mitologia (alias teorizzazione) sulle tendenze stagionali e sul suicidio. Si possono fare forti argomentazioni per le tendenze stagionali, in qualsiasi direzione, quindi abbiamo bisogno di analisi quantitative per (dis) confermare. Dal punto di vista della salute pubblica, se riscontrassimo forti discontinuità potremmo indirizzare gli interventi. Non lo vedo in questi dati. Dal punto di vista della teoria del suicidio, la conferma anche di piccole tendenze potrebbe favorire lo sviluppo della teoria.
svannoy,

1

Per la stima visiva iniziale, è possibile utilizzare il seguente grafico. Tracciando i dati mensili con la curva dei loess e il suo intervallo di confidenza al 95%, sembra che vi sia un aumento di metà anno con un picco a giugno. Altri fattori potrebbero causare un'ampia distribuzione dei dati, quindi la tendenza stagionale potrebbe essere mascherata in questo diagramma di loess dei dati non elaborati. I punti dati sono stati disturbati.

inserisci qui la descrizione dell'immagine

Modifica: la trama seguente mostra la curva del loess e l'intervallo di confidenza per la modifica del numero di casi rispetto al numero del mese precedente:

inserisci qui la descrizione dell'immagine

Ciò dimostra anche che durante i mesi della prima metà dell'anno, il numero di casi continua ad aumentare, mentre diminuiscono nella seconda metà dell'anno. Ciò suggerisce anche un picco a metà anno. Tuttavia, gli intervalli di confidenza sono ampi e attraversano 0, cioè nessun cambiamento, nel corso dell'anno, indicando una mancanza di significatività statistica.

La differenza del numero di un mese può essere confrontata con la media dei valori dei 3 mesi precedenti:

inserisci qui la descrizione dell'immagine

Ciò mostra un netto aumento dei numeri a maggio e un calo a ottobre.


(-1) Esistono già tre risposte di alta qualità a questa domanda. Anche la tua risposta non risponde alla domanda postata: potresti pubblicarla come commento . Non fornisci risposta su come questi dati potrebbero essere analizzati.
Tim

Avevo precedentemente pubblicato un commento qui (vedi sotto la domanda), ma non posso pubblicare la figura nei commenti.
rnso

Anche se capisco l'editoriale qui, dirò che @rnso ha fornito un bel grafico che illustra bene la potenziale componente stagionale e avrebbe dovuto far parte del mio post originale.
svannoy,

Lo capisco e sono d'accordo, ma questa non è ancora una risposta ma piuttosto un commento o un miglioramento. @rnso potrebbe averti suggerito tramite un commento di poter guardare o includere tale trama.
Tim

@Glen_b, @ Tim: ho aggiunto un'altra trama che potrebbe essere utile e che non posso inserire in un commento.
rnso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.