Change-point Detection: Pettitt’s Test
The approach after Pettitt (1979) is commonly applied to detect a single change-point in hydrological series or climate series with continuous data.
It tests the H0: The T variables follow one or more distributions that have the same location parameter (no change), against the alternative: a change point exists.
The Pettitt-test is conducted in such a way:
01 - Load R Require Package:
02 - Load Data:
# Load Data
data <- read.csv(file = 'c:/Users/pooya/Downloads/Torbat Heydariyeh - Daily.csv',
header = TRUE)
# Compactly Display the Structure of data
str(object = data)## 'data.frame': 21915 obs. of 23 variables:
## $ Site : int 40762 40762 40762 40762 40762 40762 40762 40762 40762 40762 ...
## $ Year : int 1959 1959 1959 1959 1959 1959 1959 1959 1959 1959 ...
## $ Month : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Day : int 1 2 3 4 5 6 7 8 9 10 ...
## $ dd : num 118 170 262 226 108 240 200 128 150 248 ...
## $ ff : num 1.2 5.4 1.8 1.2 1.4 1.8 2 1 1.4 1.4 ...
## $ tmin : num -1 -1 -7 -9 -6 -8 -6 -6 -7 -7 ...
## $ t : num 3.12 0.32 -1.52 -0.76 0.92 1.56 3.4 1.92 4.6 4.08 ...
## $ tmax : num 6 1 2 4 6 7 10 7 12 10 ...
## $ td : num 1.66 -2.56 -5.88 -6.62 -5.46 -4.94 -3.36 -4.28 -6.48 -4.8 ...
## $ p0 : num 864 864 870 868 870 ...
## $ p : num 1030 1032 1042 1040 1042 ...
## $ rrr : num 0 0 0 0 0 0 0 0 0 0 ...
## $ ewm : num NA NA NA NA NA NA NA NA NA NA ...
## $ um : num NA NA NA NA NA NA NA NA NA NA ...
## $ sshn : num NA NA NA NA NA NA NA NA NA NA ...
## $ radglo24: int NA NA NA NA NA NA NA NA NA NA ...
## $ evt : num NA NA NA NA NA NA NA NA NA NA ...
## $ ewsm : num NA NA NA NA NA NA NA NA NA NA ...
## $ nm : num NA NA NA NA NA NA NA NA NA NA ...
## $ umax : int NA NA NA NA NA NA NA NA NA NA ...
## $ umin : int NA NA NA NA NA NA NA NA NA NA ...
## $ tsoil_m : int NA NA NA NA NA NA NA NA NA NA ...
## Site Year Month Day dd ff tmin t tmax td p0 p rrr
## 1 40762 1959 1 1 118 1.2 -1 3.12 6 1.66 864.18 1030.50 0
## 2 40762 1959 1 2 170 5.4 -1 0.32 1 -2.56 863.92 1032.20 0
## 3 40762 1959 1 3 262 1.8 -7 -1.52 2 -5.88 869.98 1041.75 0
## 4 40762 1959 1 4 226 1.2 -9 -0.76 4 -6.62 868.04 1040.40 0
## 5 40762 1959 1 5 108 1.4 -6 0.92 6 -5.46 870.46 1041.60 0
## 6 40762 1959 1 6 240 1.8 -8 1.56 7 -4.94 871.38 1043.15 0
## 7 40762 1959 1 7 200 2.0 -6 3.40 10 -3.36 871.06 1041.85 0
## 8 40762 1959 1 8 128 1.0 -6 1.92 7 -4.28 870.32 1041.15 0
## 9 40762 1959 1 9 150 1.4 -7 4.60 12 -6.48 869.36 1039.25 0
## 10 40762 1959 1 10 248 1.4 -7 4.08 10 -4.80 868.04 1037.50 0
## ewm um sshn radglo24 evt ewsm nm umax umin tsoil_m
## 1 NA NA NA NA NA NA NA NA NA NA
## 2 NA NA NA NA NA NA NA NA NA NA
## 3 NA NA NA NA NA NA NA NA NA NA
## 4 NA NA NA NA NA NA NA NA NA NA
## 5 NA NA NA NA NA NA NA NA NA NA
## 6 NA NA NA NA NA NA NA NA NA NA
## 7 NA NA NA NA NA NA NA NA NA NA
## 8 NA NA NA NA NA NA NA NA NA NA
## 9 NA NA NA NA NA NA NA NA NA NA
## 10 NA NA NA NA NA NA NA NA NA NA
03 - Prepare Data:
# Select Variable
Tave <- data %>%
mutate(date = as.Date(x = paste0(Year, '-', Month, '-', Day), '%Y-%m-%d')) %>%
select(date, t)
# Compactly Display the Structure of Tave
str(object = Tave)## 'data.frame': 21915 obs. of 2 variables:
## $ date: Date, format: "1959-01-01" "1959-01-02" ...
## $ t : num 3.12 0.32 -1.52 -0.76 0.92 1.56 3.4 1.92 4.6 4.08 ...
## date t
## 1 1959-01-01 3.12
## 2 1959-01-02 0.32
## 3 1959-01-03 -1.52
## 4 1959-01-04 -0.76
## 5 1959-01-05 0.92
## 6 1959-01-06 1.56
## 7 1959-01-07 3.40
## 8 1959-01-08 1.92
## 9 1959-01-09 4.60
## 10 1959-01-10 4.08
## date t
## Min. :1959-01-01 Min. :-15.85
## 1st Qu.:1973-12-31 1st Qu.: 6.22
## Median :1988-12-31 Median : 15.56
## Mean :1988-12-31 Mean : 14.88
## 3rd Qu.:2003-12-31 3rd Qu.: 24.04
## Max. :2018-12-31 Max. : 35.08
## NA's :59
04 - Pettitt’s test:
##
## Pettitt's test for single change-point detection
##
## data: Tave[["t"]]
## U* = 11366000, p-value < 2.2e-16
## alternative hypothesis: two.sided
## sample estimates:
## probable change point at time K
## 8638
## [1] "1982-10-23"
# Plot
ggplot(data = Tave, mapping = aes(x = date, y = t)) +
geom_line() +
geom_vline(mapping = aes(xintercept = as.numeric(Tave[['date']][pettittTest$estimate])),
linetype = 2,
colour = "red",
size = 2)As given in the publication of Pettitt (1979) the change-point of Page’s data is located at t = "1982-10-23", with KT = 11366000 and p = < 2.2e-16