PVC (Principal Volatility Component) estimator for the blind source separation (BSS) problem. This method is a modified version of PVC by Hu and Tsay (2014).
PVC(X, …)# S3 method for default
PVC(X, k = 1:12, ordered = FALSE, acfk = NULL, original = TRUE, alpha = 0.05, …)
# S3 method for ts
PVC(X, …)
# S3 method for xts
PVC(X, …)
# S3 method for zoo
PVC(X, …)
A vector of lags. It can be any non-zero positive integer, or a vector consisting of them. Default is 1:12
.
Whether to order components according to their volatility. Default is FALSE
.
A vector of lags to be used in testing the presence of serial autocorrelation. Applicable only if ordered = TRUE
.
Whether to return the original components or their residuals based on ARMA fit. Default is TRUE
, i.e. the original components are returned. Applicable only if ordered = TRUE
.
Alpha level for linear correlation detection. Default is 0.05.
Further arguments to be passed to or from methods.
A list of class 'bssvol', inheriting from class 'bss', containing the following components:
The estimated unmixing matrix. If ordered = TRUE
, the rows are ordered according to the order of the components.
The vector of the used lags.
The estimated sources as time series object standardized to have mean 0 and unit variances. If ordered = TRUE
, then components are ordered according to their volatility. If original = FALSE
, the sources with linear autocorrelation are replaced by their ARMA residuals.
The mean vector of X
.
The ordered original estimated sources as time series object standardized to have mean 0 and unit variances. Returned only if original = FALSE
.
The ARMA fits for the components with linear autocorrelation.
A logical vector. Is TRUE if ARMA fit was done to the corresponding component.
The value of the modified Ljung-Box test statistic for each component.
p-value based on the modified Ljung-Box test statistic for each component.
The value of the volatility clustering test statistic.
p-value based on the volatility clustering test statistic.
Assume that a \(p\)-variate \({\bf Y}\) with \(T\) observations is whitened, i.e. \({\bf Y}={\bf S}^{-1/2}({\bf X}_t - \frac{1}{T}\sum_{t=1}^T {\bf X}_{t})\), for \(t = 1, \ldots, T\), where \(\bf S\) is the sample covariance matrix of \(\bf X\). Then for each lag \(k\) we calculate $$\widehat{Cov}({\bf Y}_t {\bf Y}_t', Y_{ij, t-k}) = \frac{1}{T}\sum_{t = k + 1}^T \left({\bf Y}_t {\bf Y}_t' - \frac{1}{T-k}\sum_{t = k+1}^T {\bf Y}_t {\bf Y}_t' \right)\left(Y_{ij, t-k} - \frac{1}{T-k}\sum_{t = k+1}^T {Y}_{ij, t-k}\right),$$ where \(t = k + 1, \ldots, T\) and \(Y_{ij, t-k} = Y_{i, t-k} Y_{j, t-k}, i, j = 1, \ldots, p\). Then $${\bf g}_k({\bf Y}) = \sum_{i = 1}^p \sum_{j=1}^p (\widehat{Cov}({\bf Y}_t {\bf Y}_t', Y_{ij, t-k}))^2.$$ where \(i,j = 1, \ldots, p.\) Thus the generalized kurtosis matrix is $${\bf G}_K({\bf Y}) = \sum_{k = 1}^K {\bf g}_k({\bf Y}),$$ where \(k = 1, \ldots, K\) is the set of chosen lags. Then \(\bf U\) is the matrix with eigenvectors of \({\bf G}_K({\bf Y})\) as its rows. The final unmixing matrix is then \({\bf W} = {\bf US}^{-1/2}\), where the average value of each row is set to be positive.
For ordered = TRUE
the function orders the sources according to their volatility. First a possible linear autocorrelation is removed using auto.arima
. Then a squared autocorrelation test is performed for the sources (or for their residuals, when linear correlation is present). The sources are then put in a decreasing order according to the value of the test statistic of the squared autocorrelation test. For more information, see lbtest
.
Miettinen, M., Matilainen, M., Nordhausen, K. and Taskinen, S. (2020), Extracting Conditionally Heteroskedastic Components Using Independent Component Analysis, Journal of Time Series Analysis,41, 293--311.
Hu, Y.-P. and Tsay, R. S. (2014), Principal Volatility Component Analysis, Journal of Business & Economic Statistics, 32(2), 153--164.
# NOT RUN {
if(require("stochvol")) {
n <- 10000
A <- matrix(rnorm(9), 3, 3)
# Simulate SV models
s1 <- svsim(n, mu = -10, phi = 0.8, sigma = 0.1)$y
s2 <- svsim(n, mu = -10, phi = 0.9, sigma = 0.2)$y
s3 <- svsim(n, mu = -10, phi = 0.95, sigma = 0.4)$y
# Create a daily time series
X <- ts(cbind(s1, s2, s3) %*% t(A), end = c(2015, 338), frequency = 365.25)
res <- PVC(X)
res
coef(res)
plot(res)
head(bss.components(res))
MD(res$W, A) # Minimum Distance Index, should be close to zero
}
# }
Run the code above in your browser using DataLab