Tôi có 17 năm (1995 đến 2011) dữ liệu giấy chứng tử liên quan đến cái chết tự tử cho một tiểu bang ở Mỹ Có rất nhiều huyền thoại về những vụ tự tử và những tháng / mùa, phần lớn là mâu thuẫn và về tài liệu tôi ' đã xem xét, tôi không hiểu rõ về các phương pháp được sử dụng hoặc tin tưởng vào kết quả.
Vì vậy, tôi đã đặt ra để xem liệu tôi có thể xác định liệu các vụ tự tử có ít nhiều khả năng xảy ra trong bất kỳ tháng nào trong tập dữ liệu của mình không. Tất cả các phân tích của tôi được thực hiện trong R.
Tổng số vụ tự tử trong dữ liệu là 13.909.
Nếu bạn nhìn vào năm có ít vụ tự tử nhất, chúng xảy ra vào 309/365 ngày (85%). Nếu bạn nhìn vào năm có nhiều vụ tự tử nhất, chúng xảy ra vào 339/365 ngày (93%).
Vì vậy, có một số ngày hợp lý mỗi năm mà không có vụ tự tử. Tuy nhiên, khi tổng hợp trong tất cả 17 năm, có những vụ tự tử vào mỗi ngày trong năm, bao gồm cả ngày 29 tháng 2 (mặc dù chỉ có 5 khi trung bình là 38).
Đơn giản chỉ cần thêm số vụ tự tử vào mỗi ngày trong năm không cho thấy tính thời vụ rõ ràng (trong mắt tôi).
Tổng hợp ở cấp độ hàng tháng, tự tử trung bình mỗi tháng trong khoảng từ:
(m = 65, sd = 7.4, đến m = 72, sd = 11.1)
Cách tiếp cận đầu tiên của tôi là tổng hợp dữ liệu được thiết lập theo tháng trong tất cả các năm và thực hiện kiểm tra chi bình phương sau khi tính toán xác suất dự kiến cho giả thuyết null, rằng không có sự khác biệt có hệ thống về số lần tự tử theo tháng. Tôi đã tính toán xác suất cho mỗi tháng có tính đến số ngày (và điều chỉnh tháng 2 cho năm nhuận).
Các kết quả chi bình phương cho thấy không có sự thay đổi đáng kể theo tháng:
# So does the sample match expected values?
chisq.test(monthDat$suicideCounts, p=monthlyProb)
# Yes, X-squared = 12.7048, df = 11, p-value = 0.3131
Hình ảnh dưới đây cho thấy tổng số lượng mỗi tháng. Các đường màu đỏ nằm ngang được định vị ở các giá trị dự kiến cho tháng 2, tháng 30 và tháng 31 tương ứng. Phù hợp với kiểm tra chi bình phương, không có tháng nào nằm ngoài khoảng tin cậy 95% cho số lượng dự kiến.
Tôi nghĩ rằng tôi đã hoàn thành cho đến khi tôi bắt đầu điều tra dữ liệu chuỗi thời gian. Như tôi tưởng tượng nhiều người làm, tôi bắt đầu với phương pháp phân rã theo mùa không tham số bằng cách sử dụng stl
hàm trong gói thống kê.
Để tạo dữ liệu chuỗi thời gian, tôi bắt đầu với dữ liệu hàng tháng được tổng hợp:
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
Và sau đó thực hiện stl()
phân tách
# Seasonal decomposition
suicideByMonthFit <- stl(suicideByMonthTs, s.window="periodic")
plot(suicideByMonthFit)
Lúc này tôi trở nên lo lắng vì dường như có cả thành phần theo mùa và xu hướng. Sau nhiều nghiên cứu trên internet, tôi quyết định làm theo hướng dẫn của Rob Hyndman và George Athanasopoulos như được trình bày trong văn bản trực tuyến "Dự báo: nguyên tắc và thực hành", đặc biệt là áp dụng mô hình ARIMA theo mùa.
Tôi đã sử dụng adf.test()
và kpss.test()
để đánh giá sự ổn định và nhận được kết quả mâu thuẫn. Cả hai đều bác bỏ giả thuyết khống (lưu ý rằng họ kiểm tra giả thuyết ngược lại).
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
Sau đó, tôi đã sử dụng thuật toán trong cuốn sách để xem liệu tôi có thể xác định mức độ khác biệt cần thực hiện cho cả xu hướng và mùa hay không. Tôi đã kết thúc với nd = 1, ns = 0.
Sau đó tôi chạy auto.arima
, trong đó chọn một mô hình có cả xu hướng và thành phần theo mùa cùng với hằng số loại "trôi".
# 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
Cuối cùng, tôi đã xem xét các phần dư từ sự phù hợp và nếu tôi hiểu điều này một cách chính xác, vì tất cả các giá trị đều nằm trong giới hạn ngưỡng, chúng hoạt động giống như nhiễu trắng và do đó mô hình khá hợp lý. Tôi đã chạy thử nghiệm portmanteau như được mô tả trong văn bản, có giá trị ap cao hơn 0,05, nhưng tôi không chắc rằng mình có các tham số chính xác.
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
Quay trở lại và đọc chương về mô hình arima một lần nữa, tôi nhận ra rằng bây giờ auto.arima
đã chọn mô hình theo xu hướng và mùa. Và tôi cũng nhận ra rằng dự báo không phải là phân tích cụ thể mà tôi nên làm. Tôi muốn biết liệu một tháng cụ thể (hay nói chung là thời gian trong năm) nên được gắn cờ là tháng có rủi ro cao. Có vẻ như các công cụ trong tài liệu dự báo rất phù hợp, nhưng có lẽ không phải là tốt nhất cho câu hỏi của tôi. Bất kỳ và tất cả các đầu vào được nhiều đánh giá cao.
Tôi đang đăng một liên kết đến một tệp csv có chứa số lượng hàng ngày. Các tập tin trông như thế này:
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
Đếm là số vụ tự tử xảy ra vào ngày hôm đó. "T" là một chuỗi số từ 1 đến tổng số ngày trong bảng (5533).
Tôi đã lưu ý các ý kiến dưới đây và nghĩ về hai điều liên quan đến mô hình tự tử và các mùa. Đầu tiên, đối với câu hỏi của tôi, tháng chỉ đơn giản là proxy để đánh dấu sự thay đổi của mùa, tôi không quan tâm đến thời tiết hay không một tháng cụ thể nào khác với những người khác (tất nhiên đó là một câu hỏi thú vị, nhưng đó không phải là điều tôi đặt ra điều tra). Do đó, tôi nghĩ việc cân bằng các tháng bằng cách sử dụng 28 ngày đầu tiên của tất cả các tháng là hợp lý. Khi bạn làm điều này, bạn sẽ có một sự phù hợp tồi tệ hơn một chút, mà tôi đang diễn giải như nhiều bằng chứng cho việc thiếu tính thời vụ. Trong kết quả đầu ra bên dưới, sự phù hợp đầu tiên là sự sao chép từ câu trả lời bên dưới bằng cách sử dụng tháng với số ngày thực sự của họ, theo sau là một tập hợp dữ liệu tự tửByShortMonthtrong đó số người tự tử được tính từ 28 ngày đầu tiên của tất cả các tháng. Tôi quan tâm đến những gì mọi người nghĩ về thời tiết hay không sự điều chỉnh này là một ý tưởng tốt, không cần thiết hay có hại?
> 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
Điều thứ hai tôi đã xem xét nhiều hơn là vấn đề sử dụng tháng làm proxy cho mùa vụ. Có lẽ một chỉ báo tốt hơn về mùa là số giờ ban ngày mà một khu vực nhận được. Dữ liệu này đến từ một tiểu bang phía bắc có sự thay đổi đáng kể về ánh sáng ban ngày. Dưới đây là biểu đồ của ánh sáng ban ngày từ năm 2002.
Khi tôi sử dụng dữ liệu này thay vì tháng trong năm, hiệu quả vẫn rất đáng kể, nhưng hiệu quả rất nhỏ. Độ lệch còn lại lớn hơn nhiều so với các mô hình trên. Nếu giờ ban ngày là một mô hình tốt hơn cho các mùa và sự phù hợp là không tốt, thì đây có phải là bằng chứng về hiệu ứng theo mùa rất nhỏ?
> 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
Tôi đang đăng các giờ ban ngày trong trường hợp bất cứ ai muốn chơi xung quanh với điều này. Lưu ý, đây không phải là năm nhuận, vì vậy nếu bạn muốn đưa vào biên bản cho năm nhuận, hãy ngoại suy hoặc truy xuất dữ liệu.
[ Chỉnh sửa để thêm cốt truyện từ câu trả lời đã bị xóa