def is_stationary(self, x):
"""Test whether the time series is stationary.
Parameters
----------
x : array-like, shape=(n_samples,)
The time series vector.
"""
if not self._base_case(x):
return np.nan, False
# ensure vector
x = column_or_1d(check_array(
x, ensure_2d=False, dtype=DTYPE,
force_all_finite=True)) # type: np.ndarray
n = x.shape[0]
# check on status of null
null = self.null
# fit a model on an arange to determine the residuals
if null == 'trend':
t = np.arange(n).reshape(n, 1)
# these numbers came out of the R code.. I've found 0 doc for these
table = c(0.216, 0.176, 0.146, 0.119)
elif null == 'level':
t = np.ones(n).reshape(n, 1)
# these numbers came out of the R code.. I've found 0 doc for these
table = c(0.739, 0.574, 0.463, 0.347)
else:
raise ValueError("null must be one of %r" % self._valid)
# fit the model
lm = LinearRegression().fit(t, x)
e = x - lm.predict(t) # residuals
tablep = c(0.01, 0.025, 0.05, 0.10)
s = np.cumsum(e)
eta = (s * s).sum() / (n**2)
s2 = (e * e).sum() / n
scalar, denom = 10, 14
if self.lshort:
scalar, denom = 3, 13
l = int(np.trunc(scalar * np.sqrt(n) / denom))
# compute the C subroutine
s2 = C_tseries_pp_sum(e, n, l, s2)
stat = eta / s2
# do approximation
_, pval = approx(table, tablep, xout=stat, rule=2)
# R does a test for rule=1, but we don't want to do that, because they
# just do it to issue a warning in case the P-value is smaller/greater
# than the printed value is.
return pval[0], pval[0] < self.alpha
评论列表
文章目录