私は、米国の州の自殺による死亡に関連する17年(1995年から2011年)の死亡証明書データを持っています。確認しましたが、使用した方法の明確な感覚や結果に対する自信が得られません。
そのため、データセット内の特定の月に自殺が多かれ少なかれ発生する可能性があるかどうかを判断できるかどうかを確認しました。私の分析はすべてRで行われます。
データに含まれる自殺者の総数は13,909人です。
自殺が最も少ない年を見ると、309/365日(85%)に発生します。自殺が最も多い年を見ると、それらは339/365日(93%)に発生しています。
したがって、毎年自殺のないかなりの日数があります。ただし、17年間すべてで集計すると、2月29日を含む1年の毎日に自殺があります(平均が38の場合は5人のみ)。
1年の各日に自殺者の数を単純に合計しても、明確な季節性を示すものではありません(私の目には)。
月ごとのレベルで集計すると、月あたりの平均自殺者の範囲は次のとおりです。
(m = 65、sd = 7.4、m = 72、sd = 11.1)
私の最初のアプローチは、すべての年の月ごとにデータセットを集計し、月ごとの自殺数に系統的な分散がないという帰無仮説の予想確率を計算した後、カイ二乗検定を行うことでした。日数を考慮して(そしてうるう年の2月を調整して)各月の確率を計算しました。
カイ2乗の結果は、月ごとに大きな変動がないことを示しています。
# So does the sample match expected values?
chisq.test(monthDat$suicideCounts, p=monthlyProb)
# Yes, X-squared = 12.7048, df = 11, p-value = 0.3131
下の画像は、1か月あたりの合計数を示しています。水平の赤い線は、それぞれ2月、30日月、31日月の期待値に配置されています。カイ2乗検定と一致して、予想カウントの95%信頼区間外にある月はありません。
時系列データの調査を開始するまで、私は終わったと思いました。多くの人が想像するstl
ように、statsパッケージの関数を使用したノンパラメトリック季節分解法から始めました。
時系列データを作成するには、集約された月次データから始めました。
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")
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
そして、stl()
分解を実行しました
# Seasonal decomposition
suicideByMonthFit <- stl(suicideByMonthTs, s.window="periodic")
plot(suicideByMonthFit)
この時点で心配したのは、季節的な要素と傾向の両方があるように思えるからです。多くのインターネット調査の後、私は、特に季節ARIMAモデルを適用するために、オンラインテキスト「予測:原則と実践」に記載されているRob HyndmanとGeorge Athanasopoulosの指示に従うことにしました。
を使用adf.test()
しkpss.test()
て定常性を評価し、矛盾する結果を得ました。彼らは両方とも帰無仮説を拒否しました(反対の仮説をテストすることに注意してください)。
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
次に、本のアルゴリズムを使用して、トレンドとシーズンの両方で行う必要のある差分の量を判断できるかどうかを確認しました。nd = 1、ns = 0で終了しました。
次にauto.arima
、「ドリフト」型定数とともにトレンドと季節の両方の要素を持つモデルを選択しました。
# 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
> 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
最後に、フィットからの残差を調べました。これを正しく理解すれば、すべての値がしきい値の範囲内にあるため、ホワイトノイズのように動作し、モデルはかなり妥当です。本文で説明されているように、0.05をはるかに超えるp値を持つportmanteauテストを実行しましたが、パラメーターが正しいかどうかはわかりません。
Acf(residuals(bestFit))
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
アリマモデリングに関する章をもう一度読み、読んでいると、auto.arima
トレンドと季節をモデル化することを選んだことがわかりました。また、予測は特に行うべき分析ではないことも認識しています。特定の月(またはより一般的には時期)を高リスク月としてフラグ付けする必要があるかどうかを知りたい。予測に関する文献のツールは非常に適切なようですが、おそらく私の質問には最適ではありません。ありとあらゆる入力を歓迎します。
毎日のカウントを含むcsvファイルへのリンクを投稿しています。ファイルは次のようになります。
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
カウントは、その日に発生した自殺の数です。「t」は、1から表の合計日数(5533)までの数値シーケンスです。
以下のコメントに注意し、自殺と季節のモデリングに関連する2つのことについて考えました。まず、私の質問に関して、月は季節の変化をマークするための単なるプロキシであり、特定の月が他の月と異なるかどうかには興味がありません(もちろん興味深い質問ですが、それは私が着手したものではありません調査)。したがって、すべての月の最初の28日間を使用するだけで月を均等化するのは理にかなっていると思います。これを行うと、フィットがわずかに悪くなります。これは、季節性の欠如に関するより多くの証拠として解釈しています。以下の出力では、最初の適合は、真の日数を持つ月を使用した以下の回答からの複製であり、その後にデータセットsuicideByShortMonthが続きます自殺カウントは、すべての月の最初の28日間から計算されました。この調整が良いアイデアであり、必要ではないか、有害であるかどうかについて、人々がどう考えているかに興味がありますか?
> 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
2つ目は、月をシーズンのプロキシとして使用することの問題です。おそらく、季節のより良い指標は、地域が受け取る日照時間の数でしょう。このデータは、日光がかなり変化している北部の州からのものです。以下は、2002年の夏時間のグラフです。
年の月ではなくこのデータを使用すると、効果は依然として大きくなりますが、効果は非常に小さくなります。残留偏差は上記のモデルよりもはるかに大きくなります。昼間の時間が季節のより良いモデルであり、フィットがそれほど良くない場合、これは非常に小さな季節効果のより多くの証拠ですか?
> 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
誰かがこれをいじくりたいと思う場合に備えて、私は夏時間を投稿しています。これはうるう年ではないため、うるう年の分を入力する場合は、データを推定または取得します。
[ 削除された回答からプロットを追加するために編集します(削除された回答のプロットをここまで質問に移動してもかまわないことを願っています。