ฉันมีข้อมูลใบรับรองการเสียชีวิต 17 ปี (1995 ถึง 2011) ที่เกี่ยวข้องกับการฆ่าตัวตายของรัฐในสหรัฐอเมริกามีตำนานมากมายเกี่ยวกับการฆ่าตัวตายและเดือน / ฤดูกาลจำนวนมากที่ขัดแย้งกันและวรรณกรรมที่ฉัน ' ที่ผ่านมาฉันไม่เข้าใจวิธีการที่ใช้หรือความมั่นใจในผลลัพธ์
ดังนั้นฉันจึงออกเดินทางเพื่อดูว่าฉันสามารถตัดสินได้หรือไม่ว่าการฆ่าตัวตายมีแนวโน้มที่จะเกิดขึ้นมากหรือน้อยในเดือนใดก็ตามภายในชุดข้อมูลของฉัน การวิเคราะห์ทั้งหมดของฉันเสร็จสิ้นใน R
จำนวนการฆ่าตัวตายทั้งหมดในข้อมูลคือ 13,909
หากคุณดูปีที่มีการฆ่าตัวตายน้อยที่สุดพวกเขาจะเกิดขึ้นใน 309/365 วัน (85%) หากคุณดูปีที่มีการฆ่าตัวตายมากที่สุดพวกเขาจะเกิดขึ้นใน 339/365 วัน (93%)
ดังนั้นจึงมีจำนวนวันที่ยุติธรรมในแต่ละปีโดยไม่มีการฆ่าตัวตาย อย่างไรก็ตามเมื่อรวมกันตลอดทั้ง 17 ปีมีการฆ่าตัวตายในทุกวันของปีรวมถึงวันที่ 29 กุมภาพันธ์ (แม้ว่าจะเพียง 5 เมื่อเฉลี่ย 38)
เพียงแค่เพิ่มจำนวนการฆ่าตัวตายในแต่ละวันของปีไม่ได้บ่งบอกถึงฤดูกาลที่ชัดเจน (ในสายตาของฉัน)
เมื่อรวมกันในระดับรายเดือนการฆ่าตัวตายเฉลี่ยต่อเดือนมีตั้งแต่:
(m = 65, sd = 7.4, ถึง m = 72, sd = 11.1)
วิธีแรกของฉันคือการรวบรวมข้อมูลที่กำหนดโดยเดือนสำหรับทุกปีและทำการทดสอบไคสแควร์หลังจากคำนวณความน่าจะเป็นที่คาดหวังสำหรับสมมติฐานว่างว่าไม่มีการแปรปรวนของการฆ่าตัวตายอย่างเป็นระบบตามเดือน ฉันคำนวณความน่าจะเป็นในแต่ละเดือนโดยคำนึงถึงจำนวนวัน (และปรับเดือนกุมภาพันธ์เป็นปีอธิกสุรทิน)
ผลการไคสแควร์ไม่พบการเปลี่ยนแปลงที่สำคัญในแต่ละเดือน:
# So does the sample match expected values?
chisq.test(monthDat$suicideCounts, p=monthlyProb)
# Yes, X-squared = 12.7048, df = 11, p-value = 0.3131
ภาพด้านล่างแสดงจำนวนรวมต่อเดือน เส้นสีแดงแนวนอนอยู่ในตำแหน่งที่คาดหวังสำหรับเดือนกุมภาพันธ์ 30 วันและ 31 เดือนตามลำดับ สอดคล้องกับการทดสอบไคสแควร์ไม่มีเดือนอยู่นอกช่วงความมั่นใจ 95% สำหรับการนับที่คาดหวัง
ฉันคิดว่าฉันทำเสร็จแล้วจนกว่าฉันจะเริ่มตรวจสอบข้อมูลอนุกรมเวลา อย่างที่ฉันคิดว่าหลายคนทำฉันเริ่มต้นด้วยวิธีการสลายตัวตามฤดูกาลที่ไม่ใช่พารามิเตอร์โดยใช้stl
ฟังก์ชันในแพคเกจสถิติ
เพื่อสร้างข้อมูลอนุกรมเวลาฉันเริ่มต้นด้วยข้อมูลรายเดือนรวม:
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)
เมื่อมาถึงจุดนี้ฉันกลายเป็นกังวลเพราะปรากฏว่าฉันมีทั้งองค์ประกอบตามฤดูกาลและแนวโน้ม หลังจากการค้นคว้าทางอินเทอร์เน็ตมากมายฉันตัดสินใจที่จะทำตามคำแนะนำของ Rob Hyndman และ George Athanasopoulos ตามที่ระบุไว้ในข้อความออนไลน์ "การพยากรณ์: หลักการและการปฏิบัติ" โดยเฉพาะเพื่อใช้โมเดล ARIMA ตามฤดูกาล
ฉันใช้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
ในที่สุดฉันดูที่เหลือจากความพอดีและถ้าฉันเข้าใจสิ่งนี้อย่างถูกต้องเนื่องจากค่าทั้งหมดอยู่ในขีด จำกัด ขีด จำกัด พวกเขาจะทำตัวเหมือนเสียงสีขาวและแบบจำลองค่อนข้างสมเหตุสมผล ฉันรันการทดสอบกระเป๋าหิ้วตามที่อธิบายในข้อความซึ่งมีค่า ap มากกว่า 0.05 แต่ฉันไม่แน่ใจว่าฉันมีพารามิเตอร์ที่ถูกต้อง
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
เมื่อย้อนกลับไปอ่านบทเกี่ยวกับการสร้างแบบจำลอง Arima อีกครั้งฉันรู้แล้วว่าตอนนี้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
Count คือจำนวนการฆ่าตัวตายที่เกิดขึ้นในวันนั้น "t" เป็นลำดับตัวเลขจาก 1 ถึงจำนวนวันทั้งหมดในตาราง (5533)
ฉันได้รับทราบความคิดเห็นด้านล่างและคิดถึงสองสิ่งที่เกี่ยวข้องกับการสร้างแบบจำลองการฆ่าตัวตายและฤดูกาล ครั้งแรกที่เกี่ยวกับคำถามของฉันเดือนเป็นเพียงผู้รับมอบฉันทะสำหรับการทำเครื่องหมายการเปลี่ยนแปลงของฤดูกาลฉันไม่สนใจว่าจะเป็นเดือนที่แตกต่างจากคนอื่น (แน่นอนว่าเป็นคำถามที่น่าสนใจ แต่ไม่ใช่สิ่งที่ฉันกำหนดไว้ ตรวจสอบ) ดังนั้นฉันคิดว่ามันสมเหตุสมผลที่จะทำให้เท่ากันทุกเดือนโดยใช้ 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
สิ่งที่สองที่ฉันพิจารณาเพิ่มเติมคือปัญหาการใช้เดือนเป็นพร็อกซีสำหรับซีซัน บางทีตัวบ่งชี้ฤดูกาลที่ดีกว่าคือจำนวนชั่วโมงในเวลากลางวันซึ่งเป็นพื้นที่ที่ได้รับ ข้อมูลนี้มาจากสภาพทางเหนือที่มีการเปลี่ยนแปลงในเวลากลางวัน ด้านล่างนี้เป็นกราฟของเวลากลางวันจากปี 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
ฉันโพสต์เวลากลางวันในกรณีที่ใคร ๆ ก็อยากเล่นด้วย หมายเหตุนี่ไม่ใช่ปีอธิกสุรทินดังนั้นถ้าคุณต้องการใส่นาทีสำหรับปีอธิกสุรทินให้คาดการณ์หรือดึงข้อมูล
[ แก้ไขเพื่อเพิ่มพล็อตจากคำตอบที่ถูกลบ (หวังว่า rnso ไม่คิดว่าฉันจะย้ายพล็อตในคำตอบที่ถูกลบไปที่คำถามนี้ svannoy ถ้าคุณไม่ต้องการให้เพิ่มอีกเลยคุณสามารถย้อนกลับได้)]