import numpy as np
from statsmodels.stats.correlation_tools import (
kernel_covariance, GaussianMultivariateKernel)
from numpy.testing import assert_allclose
def test_kernel_covariance():
np.random.seed(342)
# Number of independent observations
ng = 1000
# Dimension of the process
p = 3
# Each component of the process in an AR(r) with 10 values
# observed on a grid
r = 0.5
ii = np.arange(10)
qm = r**np.abs(np.subtract.outer(ii, ii))
qm = np.linalg.cholesky(qm)
exog, groups, pos = [], [], []
for j in range(ng):
pos1 = np.arange(10)[:, None]
groups1 = j * np.ones(10)
# The components are independent AR processes
ex1 = np.random.normal(size=(10, 3))
ex1 = np.dot(qm, ex1)
pos.append(pos1)
groups.append(groups1)
exog.append(ex1)
groups = np.concatenate(groups)
pos = np.concatenate(pos, axis=0)
exog = np.concatenate(exog, axis=0)
for j in range(4):
if j == 0:
kernel = None
bw = None
elif j == 1:
kernel = GaussianMultivariateKernel()
bw = None
elif j == 2:
kernel = GaussianMultivariateKernel()
bw = 1
elif j == 3:
kernel = GaussianMultivariateKernel()
bw = kernel.set_default_bw(pos)
cv = kernel_covariance(exog, pos, groups, kernel=kernel, bw=bw)
assert_allclose(cv(0, 0), np.eye(p), atol=0.1, rtol=0.01)
assert_allclose(cv(0, 1), 0.5*np.eye(p), atol=0.1, rtol=0.01)
assert_allclose(cv(0, 2), 0.25*np.eye(p), atol=0.1, rtol=0.01)
assert_allclose(cv(1, 2), 0.5*np.eye(p), atol=0.1, rtol=0.01)