Ist dies eine geeignete Methode, um die saisonalen Auswirkungen von Selbstmordzahlen zu testen?

24

Ich habe 17 Jahre (1995 bis 2011) Sterbeurkunde-Daten in Bezug auf Selbstmord-Todesfälle für einen Staat in den USA. Es gibt viele Mythen über Selbstmorde und die Monate / Jahreszeiten. Nachdem ich überprüft habe, bekomme ich kein klares Gefühl für die angewandten Methoden oder das Vertrauen in die Ergebnisse.

Daher habe ich mich vorgenommen, um zu ermitteln, ob es in einem bestimmten Monat innerhalb meines Datensatzes mehr oder weniger wahrscheinlich ist, dass Selbstmorde auftreten. Alle meine Analysen werden in R durchgeführt.

Die Gesamtzahl der Selbstmorde in den Daten beträgt 13.909.

Betrachtet man das Jahr mit den wenigsten Selbstmorden, so treten sie an 309/365 Tagen auf (85%). Betrachtet man das Jahr mit den meisten Selbstmorden, so treten sie an 339/365 Tagen (93%) auf.

Es gibt also eine ganze Reihe von Tagen im Jahr ohne Selbstmorde. In der Summe aller 17 Jahre gibt es jedoch an jedem Tag des Jahres, einschließlich dem 29. Februar, Selbstmorde (obwohl nur 5, wenn der Durchschnitt 38 beträgt).

Bildbeschreibung hier eingeben

Allein die Anzahl der Selbstmorde an jedem Tag des Jahres zu addieren, bedeutet für mich keine eindeutige Saisonalität.

Auf monatlicher Ebene gerechnet reichen die durchschnittlichen Selbstmorde pro Monat von:

(m = 65, sd = 7,4 bis m = 72, sd = 11,1)

Mein erster Ansatz bestand darin, den Datensatz für alle Jahre nach Monaten zu aggregieren und einen Chi-Quadrat-Test durchzuführen, nachdem die erwarteten Wahrscheinlichkeiten für die Nullhypothese berechnet worden waren, dass es keine systematische Varianz der Selbstmordzahlen nach Monaten gab. Ich habe die Wahrscheinlichkeiten für jeden Monat unter Berücksichtigung der Anzahl der Tage berechnet (und den Februar für Schaltjahre angepasst).

Die Chi-Quadrat-Ergebnisse zeigten keine signifikante Variation nach Monat:

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

Das Bild unten zeigt die Gesamtzahl pro Monat. Die horizontalen roten Linien werden mit den erwarteten Werten für Februar, 30-Tage-Monate bzw. 31-Tage-Monate positioniert. In Übereinstimmung mit dem Chi-Quadrat-Test liegt kein Monat außerhalb des 95% -Konfidenzintervalls für erwartete Zählungen. Bildbeschreibung hier eingeben

Ich dachte, ich wäre fertig, bis ich anfing, Zeitreihendaten zu untersuchen. Wie ich mir viele Leute vorstelle, habe ich mit der nicht-parametrischen Methode der saisonalen Zerlegung mithilfe der stlFunktion im Statistikpaket begonnen.

Um die Zeitreihendaten zu erstellen, habe ich mit den aggregierten Monatsdaten begonnen:

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")

Bildbeschreibung hier eingeben

     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

Und dann die stl()Zersetzung durchgeführt

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

Bildbeschreibung hier eingeben

An diesem Punkt wurde ich besorgt, weil es für mich sowohl eine saisonale Komponente als auch einen Trend gibt. Nach intensiven Recherchen im Internet habe ich mich entschlossen, die Anweisungen von Rob Hyndman und George Athanasopoulos zu befolgen, die in ihrem Online-Text "Forecasting: Principles and Practice" (Prognose: Grundsätze und Praxis) dargelegt sind, insbesondere um ein saisonales ARIMA-Modell anzuwenden.

Ich habe adf.test()und kpss.test()für die Stationarität zu bewerten und bekam widersprüchliche Ergebnisse. Sie lehnten beide die Nullhypothese ab (und stellten fest, dass sie die entgegengesetzte Hypothese prüfen).

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

Ich habe dann den Algorithmus aus dem Buch verwendet, um festzustellen, wie viel Differenzierung sowohl für den Trend als auch für die Jahreszeit erforderlich ist. Ich endete mit nd = 1, ns = 0.

Ich lief dann auto.arima, die ein Modell wählte, das einen Trend und eine saisonale Komponente zusammen mit einer Typkonstante "Drift" hatte.

# 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

Bildbeschreibung hier eingeben

> 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

Schließlich habe ich mir die Residuen der Anpassung angesehen. Wenn ich das richtig verstehe, verhalten sich alle Werte innerhalb der Schwellenwerte wie weißes Rauschen und daher ist das Modell ziemlich vernünftig. Ich habe einen Portmanteau-Test wie im Text beschrieben durchgeführt, dessen ap-Wert deutlich über 0,05 lag, bin mir jedoch nicht sicher, ob die Parameter korrekt sind.

Acf(residuals(bestFit))

Bildbeschreibung hier eingeben

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

Nachdem ich zurückgegangen bin und das Kapitel über Arima-Modellierung noch einmal gelesen habe, wurde mir klar, dass ich auto.arimamich entschieden habe, Trend und Saison zu modellieren. Und mir ist auch klar, dass Prognosen nicht genau die Analyse sind, die ich wahrscheinlich machen sollte. Ich möchte wissen, ob ein bestimmter Monat (oder allgemeiner die Jahreszeit) als risikoreicher Monat gekennzeichnet werden soll. Es scheint, dass die Werkzeuge in der Vorhersageliteratur sehr relevant sind, aber vielleicht nicht das Beste für meine Frage. Jeder Input wird sehr geschätzt.

Ich poste einen Link zu einer CSV-Datei, die die täglichen Zählerstände enthält. Die Datei sieht folgendermaßen aus:

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

Anzahl ist die Anzahl der Selbstmorde, die an diesem Tag passiert sind. "t" ist eine numerische Folge von 1 bis zur Gesamtzahl der Tage in der Tabelle (5533).

Ich habe die folgenden Kommentare zur Kenntnis genommen und über zwei Dinge nachgedacht, die mit dem Modellieren von Selbstmord und Jahreszeiten zusammenhängen. Erstens, in Bezug auf meine Frage sind Monate lediglich Stellvertreter für den Wechsel der Jahreszeit. Es interessiert mich nicht, ob sich ein bestimmter Monat von anderen unterscheidet oder nicht (das ist natürlich eine interessante Frage, aber es ist nicht das, was ich mir vorgenommen habe untersuchen). Daher halte ich es für sinnvoll, die Monate durch die Verwendung der ersten 28 Tage aller Monate auszugleichen . Wenn Sie dies tun, bekommen Sie eine etwas schlechtere Passform, was ich als Beweis für einen Mangel an Saisonalität interpretiere. In der folgenden Ausgabe ist die erste Anpassung eine Reproduktion einer Antwort unter Verwendung von Monaten mit der tatsächlichen Anzahl von Tagen, gefolgt von einem Datensatz suicideByShortMonthin denen Selbstmordzahlen von den ersten 28 Tagen aller Monate berechnet wurden. Mich interessiert, was die Leute darüber denken, ob diese Anpassung eine gute Idee ist, nicht notwendig oder schädlich?

> 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

Das zweite, worauf ich näher eingegangen bin, ist die Frage, wie man den Monat als Proxy für die Saison verwendet. Vielleicht ist ein besserer Indikator für die Jahreszeit die Anzahl der Tageslichtstunden, die ein Gebiet erhält. Diese Daten stammen aus einem nördlichen Bundesstaat mit erheblichen Schwankungen des Tageslichts. Unten sehen Sie eine Grafik des Tageslichts aus dem Jahr 2002.

Bildbeschreibung hier eingeben

Wenn ich diese Daten anstelle des Monats des Jahres verwende, ist der Effekt immer noch signifikant, aber der Effekt ist sehr, sehr gering. Die verbleibende Abweichung ist viel größer als bei den obigen Modellen. Wenn die Tageslichtstunden ein besseres Modell für die Jahreszeiten sind und die Passform nicht so gut ist, ist dies ein weiterer Beweis für einen sehr geringen saisonalen Effekt?

> 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

Ich poste die Tagesstunden, falls jemand damit herumspielen möchte. Beachten Sie, dass dies kein Schaltjahr ist. Wenn Sie also die Minuten für die Schaltjahre eingeben möchten, können Sie die Daten entweder extrapolieren oder abrufen.

state.daylight.2002.csv

[ Bearbeiten , um einen Plot aus einer gelöschten Antwort hinzuzufügen (es macht mir hoffentlich nichts aus, wenn ich den Plot in der gelöschten Antwort hier oben auf die Frage verschiebe. Svannoy, wenn du das nicht möchtest, kannst du es zurücksetzen)]

Bildbeschreibung hier eingeben

Svannoy
quelle
1
Die Formulierung "einer unserer 50 Staaten" impliziert, dass alle Leser den Vereinigten Staaten angehören. Auch hier lauern offenbar viele Außerirdische.
Nick Cox
1
Ist das aus einem öffentlichen Datensatz? Könnten Sie die Daten von Woche zu Woche oder sogar von Tag zu Tag zur Verfügung stellen?
Elvis
1
@Elvis - Ich habe einen Link zu den täglichen Zähldaten gepostet. Die Daten stammen aus Sterbeurkunden, die „öffentlich“ sind, für deren Erhalt jedoch ein Verfahren erforderlich ist. Bei den aggregierten Zählungsdaten ist dies jedoch nicht der Fall. PS - Ich habe den Link selbst ausprobiert und er hat funktioniert, aber ich habe noch nie auf diese Weise in einem öffentlichen Dropbox-Ordner gepostet. Bitte lassen Sie mich wissen, wenn der Link nicht funktioniert.
Svannoy
1
Da es sich bei Ihren Daten um Zählungen handelt, würde ich erwarten, dass die Varianz mit dem Mittelwert zusammenhängt. Die üblichen Zeitreihenmodelle berücksichtigen dies nicht (Sie könnten jedoch versuchen, eine Transformation , z. B. ein Freeman-Tukey , auszudrücken), oder Sie könnten sich ein Zeitreihenmodell ansehen, das für die Zählung von Daten ausgelegt ist. (Wenn Sie dies nicht tun, ist dies möglicherweise kein großes Problem, da die Anzahl nur einen Faktor von etwa zwei
übersteigt
1
ytμtVar(yt)=μt

Antworten:

13

Was ist mit einer Poisson-Regression?

Ich habe einen Datenrahmen erstellt, der Ihre Daten sowie einen Index tfür die Zeit (in Monaten) und eine Variable monthdaysfür die Anzahl der Tage in jedem Monat enthält.

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

So sieht es also aus:

> 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

Vergleichen wir nun ein Modell mit einem Zeiteffekt und einem Anzahl-Tage-Effekt mit einem Modell, in dem wir einen Monatseffekt hinzufügen:

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

Hier ist die Zusammenfassung des "kleinen" Modells:

> 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

Sie sehen, dass die beiden Variablen weitgehend signifikante Randeffekte haben. Schauen Sie sich jetzt das größere Modell an:

> 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

Nun, natürlich monthdaysverschwindet der Effekt. es kann nur dank Schaltjahren geschätzt werden !! Wenn Sie es im Modell belassen (und Schaltjahre berücksichtigen), können Sie die verbleibenden Abweichungen verwenden, um die beiden Modelle zu vergleichen.

> 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

Also kein (signifikanter) Monatseffekt? Aber was ist mit einem saisonalen Effekt? Wir können versuchen, die Saisonalität mit zwei Variablen zu erfassencos(2πt12)Sünde(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

Vergleichen Sie es nun mit dem Nullmodell:

> 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

Man kann also mit Sicherheit sagen, dass dies auf einen saisonalen Effekt hindeutet ...

Elvis
quelle
2
p
2
Ich stimme vollkommen zu, das habe ich angedeutet :) "Man kann mit Sicherheit sagen, dass dies einen Effekt suggeriert"; und nicht "Es gibt einen Effekt"! Was ich interessant finde, ist diese trigonometrische Transformation, sie ist sehr natürlich und ich verstehe nicht, warum sie nicht öfter gesehen wird. Aber dies ist nur ein Ausgangspunkt ... Bootstrapping, Bewertung des Modells ... viel zu tun.
Elvis
1
Kein Problem! Leider konnte ich den Witz nicht erkennen. :)
usεr11852 sagt Reinstate Monic
2
+1. Poisson trifft Fourier ... Ich denke, Ökonomen und einige andere betonen Indikatorvariablen, weil Saisonalität ein wichtiger Faktor sein kann, aber der trigonometrische Ansatz hilft oft.
Nick Cox
2
Tatsächlich. Eine von mir verfasste Rezension des Tutorials finden Sie unter stata-journal.com/article.html?article=st0116
Nick Cox,
8

Ein Chi-Quadrat-Test ist ein guter Ansatz, um Ihre Frage vorab zu beantworten.

Die stlZerlegung kann irreführend sein, um das Vorhandensein von Saisonalität zu testen. Diese Prozedur schafft es, ein stabiles saisonales Muster zurückzugeben, selbst wenn ein weißes Rauschen (Zufallssignal ohne Struktur) als Eingabe übergeben wird. Versuchen Sie zum Beispiel:

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

Das Betrachten der durch ein automatisches ARIMA-Modellauswahlverfahren ausgewählten Aufträge ist ebenfalls ein bisschen riskant, da ein saisonales ARIMA-Modell nicht immer eine Saisonalität beinhaltet (Einzelheiten finden Sie in dieser Diskussion ). In diesem Fall generiert das ausgewählte Modell saisonale Zyklen und der Kommentar von @RichardHardy ist vernünftig. Es ist jedoch eine weitere Einsicht erforderlich, um den Schluss zu ziehen, dass Selbstmorde von einem saisonalen Muster getrieben werden.

Im Folgenden fasse ich einige Ergebnisse zusammen, die auf der Analyse der von Ihnen veröffentlichten Monatsreihen basieren. Dies ist die saisonale Komponente, die nach dem grundlegenden strukturellen Zeitreihenmodell geschätzt wird:

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)

geschätzte saisonale Komponente

Eine ähnliche Komponente wurde mit der Software TRAMO-SEATS mit Standardoptionen extrahiert. Wir können sehen, dass das geschätzte saisonale Muster über die Zeit nicht stabil ist und daher die Hypothese eines wiederkehrenden Musters in Bezug auf die Anzahl der Selbstmorde über Monate während des Stichprobenzeitraums nicht stützt. Beim Ausführen der Software X-13ARIMA-SEATS mit Standardoptionen wurde beim kombinierten Test auf Saisonalität festgestellt, dass keine identifizierbare Saisonalität vorhanden ist.

Bearbeiten (siehe diese Antwort und meinen Kommentar unten für eine Definition der identifizierbaren Saisonalität ).

Angesichts der Art Ihrer Daten ist es sinnvoll, diese Analyse auf der Grundlage von Zeitreihenmethoden durch ein Modell für Zähldaten (z. B. Poisson-Modell) zu ergänzen und die Bedeutung der Saisonalität in diesem Modell zu testen. Das Hinzufügen der Tag -Zähldaten zu Ihrer Frage kann zu mehr Ansichten und möglichen Antworten in dieser Richtung führen.

javlacalle
quelle
Danke @javiacalle, ich werde die von Ihnen vorgeschlagenen Methoden untersuchen. Darf ich nach Ihrer Schlussfolgerung aus dem Diagramm fragen, das Sie veröffentlicht haben? Ist es die Tatsache, dass die Amplitude im Laufe der Jahre zunimmt, die die Grundlage Ihres Kommentars ist? Wir können feststellen, dass das geschätzte saisonale Muster über die Zeit nicht stabil ist? Umfasst die subtilere Beobachtung, dass die Form jedes Peaks etwas anders ist? Ich nehme das erstere an, aber wir wissen, wohin uns Annahmen führen.
Svannoy
2
χ2
@svannoy Die wichtigste Schlussfolgerung, die auf den in meiner Antwort verwendeten Zeitreihenmethoden basiert, ist, dass die Stichprobendaten kein klares saisonales Muster enthalten. Obwohl saisonale Zyklen einen Teil der Variabilität der Daten erklären, kann ein saisonales Muster nicht zuverlässig identifiziert werden, da es durch ein hohes Maß an unregelmäßigen Schwankungen verdeckt wird (dies könnte auch überprüft werden, indem die in der Frage gezeigte Verstärkungsfunktion des ausgewählten ARIMA-Modells angezeigt wird). .
Javlacalle
@oDDsKooL Ich habe auch den Chi-Quadrat-Test am Wochentag durchgeführt, Samstag / Sonntag liegen etwas unter den Erwartungen und Montag / Dienstag liegen knapp über ....
svannoy
6

Wie in meinem Kommentar erwähnt, ist dies ein sehr interessantes Problem. Die Ermittlung der Saisonalität ist keine statistische Aufgabe. Ein vernünftiger Ansatz wäre die Konsultation von Theorie und Experten wie:

  • Psychologe
  • Psychiater
  • Soziologe

Zu diesem Problem zu verstehen, warum es Saisonalität gibt, um die Datenanalyse zu ergänzen. Bei den Daten habe ich eine ausgezeichnete Zerlegungsmethode namens UCM (Unobserved Components Model ) verwendet, bei der es sich um eine Art Zustandsraummethode handelt. Siehe auch diesen sehr leicht zugänglichen Artikel von Koopman. Mein Ansatz ähnelt @Javlacalle. Es bietet nicht nur ein Tool zur Zerlegung von Zeitreihendaten, sondern bewertet auch objektiv das Vorhandensein oder Fehlen von Saisonalität durch Signifikanztests. Ich bin kein großer Fan von Signifikanztests für nicht experimentelle Daten, aber ich kenne kein anderes Verfahren, mit dem Sie Ihre Hypothese zum Vorhandensein / Fehlen von Saisonalität für Zeitreihendaten testen können.

Viele ignorieren, aber ein sehr wichtiges Merkmal, das man verstehen möchte, ist die Art der Saisonalität:

  1. Stochastisch - Änderungen zufällig und schwer vorherzusagen
  2. Deterministisch - ändert sich nicht, perfekt vorhersehbar. Sie können Dummy oder Trigonometrie (sin / cos usw.) zum Modellieren verwenden

Bei längeren Zeitreihendaten wie Ihren ist es möglich, dass sich die Saisonalität im Laufe der Zeit geändert hat. Wieder ist UCM der einzige Ansatz, den ich kenne, der diese stochastische / deterministische Saisonalität erkennen kann. UCM kann Ihr Problem in folgende "Komponenten" zerlegen:

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

Sie können auch testen, ob Pegel, Steigung, Zyklus deterministisch oder stochastisch sind. Bitte beachte das level + slope = trend. Im Folgenden präsentiere ich eine Analyse Ihrer Daten mit UCM. Ich habe SAS für die Analyse verwendet.

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;

Nach mehreren Iterationen unter Berücksichtigung verschiedener Komponenten und Kombinationen endete ich mit einem sparsamen Modell der folgenden Form:

Es gibt ein stochastisches Niveau + deterministische Saisonalität + einige Ausreißer, und die Daten weisen keine anderen nachweisbaren Merkmale auf.

Bildbeschreibung hier eingeben

Nachfolgend finden Sie eine Signifikanzanalyse verschiedener Komponenten. Beachten Sie, dass ich Trigonometrie (das ist sin / cos in der Saisonalitätsangabe in PROC UCM) ähnlich wie @Elvis und @Nick Cox verwendet habe. Sie könnten auch Dummy-Codierung in UCM verwenden, und als ich beide getestet habe, ergaben sich ähnliche Ergebnisse. In dieser Dokumentation finden Sie Unterschiede zwischen den beiden Methoden zum Modellieren der Saisonalität in SAS.

Bildbeschreibung hier eingeben

Wie oben gezeigt, haben Sie Ausreißer: Zwei Impulse und eine Pegelverschiebung im Jahr 2009 (spielten Wirtschafts- / Immobilienblasen nach 2009 eine Rolle?), Was durch eine weitere Tiefenanalyse erklärt werden könnte. Eine gute Eigenschaft der Verwendung Proc UCMist, dass sie eine hervorragende grafische Ausgabe liefert.

Nachfolgend finden Sie die Saisonalität und eine kombinierte Trend- und Saisonalitätsdarstellung. Was übrig bleibt, ist Lärm .

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Ein wichtigerer Diagnosetest, wenn Sie p-Werte und Signifikanztests verwenden möchten, besteht darin, zu überprüfen, ob Ihre Residuen musterlos und normalverteilt sind. Dies wird im obigen Modell mit UCM und wie unten in den Residuendiagnoseplots wie acf / pacf gezeigt erfüllt und andere.

Bildbeschreibung hier eingeben

Schlussfolgerung : Basierend auf der Datenanalyse mit UCM und Signifikanztests scheinen die Daten saisonabhängig zu sein. In den Sommermonaten Mai / Juni / Juli ist die Zahl der Todesfälle hoch und in den Wintermonaten Dezember und Februar die niedrigste.

Zusätzliche Überlegungen : Bitte berücksichtigen Sie auch die praktische Bedeutung des Ausmaßes der saisonalen Variation. Um kontrafaktische Argumente zu negieren, konsultieren Sie bitte Domain-Experten, um Ihre Hypothese weiter zu ergänzen und zu validieren.

Ich sage keineswegs, dass dies der einzige Ansatz ist, um dieses Problem zu lösen. Die Funktion, die mir an UCM gefällt, besteht darin, dass Sie alle Zeitreihenfunktionen explizit modellieren können, und sie ist auch sehr visuell.

Prognostiker
quelle
Vielen Dank für diese Antwort und für interessante Kommentare. Ich kenne UCM nicht, es scheint sehr interessant, ich werde versuchen, das im Hinterkopf zu behalten ...
Elvis
(+1) Interessante Analyse. Ich wäre immer noch vorsichtig, wenn ich auf das Vorhandensein eines signifikanten deterministischen saisonalen Musters schließen würde, aber Ihre Ergebnisse erfordern einen genaueren Blick auf diese Möglichkeit. Der Canova- und Hansen-Test für die saisonale Stabilität könnte hilfreich sein, er wird hier zum Beispiel beschrieben .
Javlacalle
gretlπ/6
1
+1. Viele interessante und hilfreiche Kommentare. Zu Ihrer Liste von Psychologen, Psychiatern und Soziologen könnten Meteorologen / Klimatologen hinzugefügt werden. Eine solche Person möchte hinzufügen, dass keine zwei Jahre in Regen- und Temperaturzyklen identisch sind. Ich hätte grob mehr Depressionen im Winter erraten (kürzere Tageslängen usw.), aber so viel für eine Schätzung, die einige Daten gegeben hätte.
Nick Cox
Vielen Dank an @forecaster, dies trägt viel zu meinem Lernen bei. Ich bin ein Psychologe mit einem Abschluss in öffentlicher Gesundheit. Ich würde Epidemiologen zu Ihrer Liste hinzufügen. Wie ich eingangs erwähne, gibt es eine Menge Mythologie (auch bekannt als Theoretisierung) über saisonale Trends und Selbstmord. Man kann starke Argumente für saisonale Trends in jede Richtung vorbringen, so dass wir quantitative Analysen benötigen, um diese zu (ent) bestätigen. Unter dem Gesichtspunkt der öffentlichen Gesundheit könnten wir gezielte Maßnahmen ergreifen, wenn wir starke Diskontinuitäten feststellen würden. Ich sehe das nicht in diesen Daten. Aus der Perspektive der Selbstmordtheorie könnte die Bestätigung selbst kleiner Trends die Theorieentwicklung beeinflussen.
Svannoy
1

Zur ersten visuellen Abschätzung kann das folgende Diagramm verwendet werden. Wenn man die monatlichen Daten mit Lösskurve und ihrem 95% -Konfidenzintervall grafisch darstellt, scheint es, dass es einen Anstieg zur Jahresmitte gibt, der im Juni seinen Höhepunkt erreicht. Andere Faktoren können dazu führen, dass die Daten weit verbreitet sind, sodass der saisonale Trend in diesem Rohdaten-Loess-Diagramm möglicherweise ausgeblendet wird. Die Datenpunkte wurden verwackelt.

Bildbeschreibung hier eingeben

Bearbeiten: Die folgende Darstellung zeigt die Lösskurve und das Konfidenzintervall für die Änderung der Fallzahl gegenüber der Zahl im Vormonat:

Bildbeschreibung hier eingeben

Dies zeigt auch, dass in den Monaten des ersten Halbjahres die Zahl der Fälle weiter steigt, während sie in der zweiten Jahreshälfte sinken. Dies deutet auch auf einen Höhepunkt zur Jahresmitte hin. Die Konfidenzintervalle sind jedoch breit und gehen über 0, dh keine Veränderung, im Laufe des Jahres, was auf eine fehlende statistische Signifikanz hinweist.

Die Differenz der Monatszahlen kann mit dem Durchschnitt der vorherigen 3 Monate verglichen werden:

Bildbeschreibung hier eingeben

Dies zeigt einen deutlichen Anstieg der Zahlen im Mai und einen Rückgang im Oktober.

rnso
quelle
(-1) Auf diese Frage gibt es bereits drei qualitativ hochwertige Antworten. Ihre Antwort beantwortet auch nicht die gepostete Frage - Sie können sie als Kommentar posten . Sie geben keine Antwort, wie diese Daten analysiert werden könnten.
Tim
Ich hatte zuvor hier einen Kommentar gepostet (siehe unter der Frage), kann aber keine Zahl in Kommentaren posten.
So
Obwohl ich das Editorial hier verstehe, werde ich sagen, dass @rnso ein nettes Diagramm zur Verfügung gestellt hat, das die mögliche saisonale Komponente gut illustriert und ein Teil meines ursprünglichen Posts hätte sein sollen.
Svannoy
Ich verstehe das und bin damit einverstanden, aber dies ist keine Antwort, sondern ein Kommentar oder eine Verbesserung. @rnso hätte Ihnen über einen Kommentar vorschlagen können, dass Sie sich eine solche Handlung ansehen oder einschließen könnten.
Tim
@Glen_b, @ Tim: Ich habe eine weitere Handlung hinzugefügt, die nützlich sein könnte und die ich nicht in einen Kommentar einfügen kann.
RNSO