def test_singular(): """Runs the high-dimensional case. """ p = 2 n = 13 sigma = np.eye(p, p) data = np.random.multivariate_normal(np.zeros(p), sigma, n) data = np.hstack((data, data)) with pytest.raises(ValueError): sigma_tilde = nls.shrink_cov(data, 0)
def test_large_p(): """Runs the high-dimensional case. """ p = 13 n = 12 sigma = np.eye(p, p) data = np.random.multivariate_normal(np.zeros(p), sigma, n) sigma_tilde = nls.shrink_cov(data, 0) S = np.sum(sigma_tilde[np.eye(p) == 0]) / n_choose_k(p, 2) / np.sum(np.diag(sigma_tilde)) * p assert S < 1 # assert that the diagonal is the major contributor
def test_ols(): """Runs the high-dimensional case. """ p = 2 n = 14 sigma = np.eye(p, p) data = np.random.multivariate_normal(np.zeros(p), sigma, n) + np.arange(n)[:, np.newaxis] + 1 x = np.vstack((np.ones(n).T, np.arange(n).T)).T betahat = np.linalg.solve(np.dot(x.T, x), np.dot(x.T, data)) datahat = np.dot(x, betahat) res = data - datahat sigma_tilde = nls.shrink_cov(res, k=2) # corresponding to 2 degrees of freedom S = np.sum(sigma_tilde[np.eye(p) == 0]) / n_choose_k(p, 2) / np.sum(np.diag(sigma_tilde)) * p assert S < 1 # assert that the diagonal is the major contributor
def test_analytic_shrinkage(): """Runs the most simple possible test: 2 variables with 12 samples. """ x = np.array([[-0.98511153, -0.2599713], [0.20374114, -0.59699234], [0.28570754, 0.77542166], [-0.78768299, 0.45808448], [0.80494623, -2.16308943], [-2.01761751, -0.27944538], [-0.24710646, -0.33260174], [0.369508, 0.57123535], [2.07913481, -0.0749686], [1.07194672, -0.69343179], [-0.11947645, -1.45457297], [-0.54877366, -1.21191041]]) expected = np.array([[1.04344299, 0.0335051], [0.0335051, 1.11112703]]) sigma_tilde = nls.shrink_cov(x, 0) np.testing.assert_allclose(sigma_tilde, expected)
ps = np.arange(start=10, stop=200, step=20) print(ps) e_prial = np.zeros(len(ps)) for i, p in enumerate(ps): reps = int(np.maximum(100, np.minimum(100, 1e5 / p))) prial = np.zeros(reps, dtype=float) for j in np.arange(reps): n = 600 lam = np.concatenate([np.ones(int(p / 5)), 3 * np.ones(int(2 * p / 5.)), 10 * np.ones(int(2 * p / 5.))]) sigma = np.diag(np.ones(p) * lam) xx = np.random.randn(n, p) d, u = np.linalg.eigh(sigma) # y = np.linalg.solve(u.T, xx.T) s_sqrt = np.eye(p, p) * np.sqrt(lam) y = np.dot(xx, s_sqrt) s_tilde = nls.shrink_cov(y) s_sample = np.cov(y.T) pr = ana.prial(s_sample, s_tilde, sigma) prial[j] = float(pr) e_prial[i] = np.mean(prial) print(np.mean(prial)) print(e_prial)
def nonlin_shrink(self): S_nlshrink = nls.shrink_cov(self.X) return S_nlshrink