I am fairly new to time series analysis. I am using hourly data for six months time period. My time series has seasonality every week. Per Dr.Robert Hyndman
I set up my time series variable and then did a kpss.test,
cooltemp = ts(training$vol, frequency = 168) checkl <- kpss.test(cooltemp, null = "Level") checkt <- kpss.test(cooltemp, null = "Trend")
output ofcheckl
was,
KPSS Test for Level Stationarity data: cooltemp KPSS Level = 4.0716, Truncation lag parameter = 13, p-value = 0.01
output of check checkt
was ,
KPSS Test for Trend Stationarity data: cooltemp KPSS Trend = 1.24, Truncation lag parameter = 13, p-value = 0.01
There is a weekly seasonality in the data and I assume for checkt , it should be "p-value greater than printed p-value" for Trend.
The reason is, i checked with the example,
x <- 0.3*(1:1000)+rnorm(1000) xt <- kpss.test(x, null = "Trend") xl <- kpss.test(x, null = "Level")
The result of xt
is,
KPSS Test for Trend Stationarity data: x KPSS Trend = 0.042451, Truncation lag parameter = 7, p-value = 0.1
that shows that Trend station null hypothesis can be accepted. And the result of xl
is
KPSS Test for Level Stationarity data: x KPSS Level = 12.598, Truncation lag parameter = 7, p-value = 0.01
The result of null hypothesis level can be rejected.
I am confused on how to interpret in my case, where I get both are 0.01, where I have to reject both of my null hypothesis.
Best Answer
Firstly, If you dataset contains hourly data then the frequency of the time series should be 24.
cooltemp = ts(training$vol, frequency = 24)
Secondly, It is preferable for KPSS test, that you reject null hypothesis if p-value < 0.05
. p-value greater than printed p-value only indicates that the value has been rounded off to two decimal points. Your value for checkt
will not be greater that 0.05 even if the statement was printed in the console.
From the above outputs for checkl
and checkt
, we can say that your series is non-stationary on level and trend. You should consider differencing the time-series to make it stationary.
Since you know there is weekly seasonality in the series, therefore I would suggest taking a seasonal difference as in the following r code:
checkl <- kpss.test(diff(cooltemp,7), null = "Level") checkt <- kpss.test(diff(cooltemp,7), null = "Trend")
If you wish to check the order of differencing and seasonal differencing are required to make the series stationary, you can try the following code:
ns <- nsdiffs(cooltemp) if(ns > 0) { xstar <- diff(x,lag=frequency(x),differences=ns) } else { xstar <- x } nd <- ndiffs(xstar) if(nd > 0) { xstar <- diff(xstar,differences=nd) }
Similar Posts:
- Solved – Confused on kpss.test shows both “Trend” and “Level” are smaller than p-value R
- Solved – Confused on kpss.test shows both “Trend” and “Level” are smaller than p-value R
- Solved – How to check and then remove stationarity and autocorrelation from time series data
- Solved – How to interpret KPSS results
- Solved – R: Box.test vs adf.test vs kpss.test