# load corpcor library
library("corpcor")
# small n, large p
p <- 100
n <- 20
# generate random pxp covariance matrix
sigma <- matrix(rnorm(p*p),ncol=p)
sigma <- crossprod(sigma)+ diag(rep(0.1, p))
# simulate multinormal data of sample size n
sigsvd <- svd(sigma)
Y <- t(sigsvd$v %*% (t(sigsvd$u) * sqrt(sigsvd$d)))
X <- matrix(rnorm(n * ncol(sigma)), nrow = n) %*% Y
# estimate covariance matrix
s1 <- cov(X)
s2 <- cov.shrink(X)
# squared error
sum((s1-sigma)^2)
sum((s2-sigma)^2)
# varcov produces the same results as cov
vc <- varcov(X)
sum(abs(vc$S-s1))
# compare positive definiteness
is.positive.definite(s1)
is.positive.definite(s2)
is.positive.definite(sigma)
# compare ranks and condition
rank.condition(s1)
rank.condition(s2)
rank.condition(sigma)
# compare eigenvalues
e1 <- eigen(s1, symmetric=TRUE)$values
e2 <- eigen(s2, symmetric=TRUE)$values
e3 <- eigen(sigma, symmetric=TRUE)$values
m <-max(e1, e2, e3)
yl <- c(0, m)
par(mfrow=c(1,3))
plot(e1, main="empirical")
plot(e2, ylim=yl, main="shrinkage")
plot(e3, ylim=yl, main="true")
par(mfrow=c(1,1))
Run the code above in your browser using DataLab