### R code from vignette source 'EESPCA_Example.Rnw'

###################################################
### code chunk number 1: EESPCA_Example.Rnw:35-39
###################################################
library(MASS)
library(PMA)
library(rifle)
library(EESPCA)


###################################################
### code chunk number 2: EESPCA_Example.Rnw:45-46
###################################################
set.seed(2)


###################################################
### code chunk number 3: EESPCA_Example.Rnw:51-55
###################################################
p =10 # number of variables
prop.info = 0.4 # proportion of variables that have non-zero loadings on the 1st PC
rho = 0.5 # covariance between informative variables
n = 100 # simulated sample size


###################################################
### code chunk number 4: EESPCA_Example.Rnw:62-68
###################################################
S = matrix(0, nrow=p, ncol=p)
num.info = p*prop.info
S[1:num.info, 1:num.info] = rho
S[p,p-1] = S[p-1,p] = rho
diag(S) = 1 
S


###################################################
### code chunk number 5: EESPCA_Example.Rnw:75-76
###################################################
(eigen.out = eigen(S))


###################################################
### code chunk number 6: EESPCA_Example.Rnw:83-86
###################################################
v1 = eigen.out$vectors[,1]
lambda1 = eigen.out$values[1]
(approx.v1.sq = computeApproxNormSquaredEigenvector(S, v1, lambda1, trace=T))


###################################################
### code chunk number 7: EESPCA_Example.Rnw:93-95
###################################################
X = mvrnorm(n=n, mu=rep(0,p), Sigma=S)
S.hat = cov(X)


###################################################
### code chunk number 8: EESPCA_Example.Rnw:100-103
###################################################
prcomp.out = prcomp(X)
(V.2 = prcomp.out$rotation[,1:2])
prcomp(X)$sdev[1:2]^2


###################################################
### code chunk number 9: EESPCA_Example.Rnw:110-111
###################################################
(pca.error = reconstructionError(X, V.2))


###################################################
### code chunk number 10: EESPCA_Example.Rnw:116-121
###################################################
computeEuclideanDistance = function(x1, x2) {
   # To account for the arbitrary sign of eigenvectors, taking absolute value first.
  return (sqrt(sum((abs(x1) - abs(x2))^2)))
}
(pca.L2 = computeEuclideanDistance(v1, prcomp.out$rotation[,1]))


###################################################
### code chunk number 11: EESPCA_Example.Rnw:126-131
###################################################
v1 = prcomp.out$rotation[,1]
v1^2
lambda1 = prcomp.out$sdev[1]^2
(approx.v1.sq = computeApproxNormSquaredEigenvector(S.hat, v1, lambda1, trace=F))
(ratio = sqrt(approx.v1.sq)/abs(v1))


###################################################
### code chunk number 12: EESPCA_Example.Rnw:136-138
###################################################
eespca.out = eespcaForK(X, k=2, trace=F, compute.sparse.lambda=T)
eespca.out


###################################################
### code chunk number 13: EESPCA_Example.Rnw:143-144
###################################################
(eespca.error = reconstructionError(X, eespca.out$V))


###################################################
### code chunk number 14: EESPCA_Example.Rnw:149-150
###################################################
(eespca.L2 = computeEuclideanDistance(v1, eespca.out$V[,1]))


###################################################
### code chunk number 15: EESPCA_Example.Rnw:156-161
###################################################
p = ncol(X)
default.thresh = 1/sqrt(p)  
sparse.threshold.values=seq(from=0.75*default.thresh, to=1.25*default.thresh, 
	length.out=21)  
cv.out = eespcaCV(X, sparse.threshold.values=sparse.threshold.values)


###################################################
### code chunk number 16: EESPCA_Example.Rnw:165-166
###################################################
eespca.cv.v1 = eespca(X, sparse.threshold=cv.out$best.sparsity, compute.sparse.lambda=T)$v1.sparse


###################################################
### code chunk number 17: EESPCA_Example.Rnw:170-174
###################################################
X.resid = computeResidualMatrix(X, eespca.cv.v1)
cv.out = eespcaCV(X.resid, sparse.threshold.values=sparse.threshold.values)
eespca.cv.v2 =  eespca(X.resid, sparse.threshold=cv.out$best.sparsity, compute.sparse.lambda=T)$v1.sparse
(V = cbind(eespca.cv.v1,eespca.cv.v2))


###################################################
### code chunk number 18: EESPCA_Example.Rnw:179-180
###################################################
(eespca.cv.error = reconstructionError(X, V))


###################################################
### code chunk number 19: EESPCA_Example.Rnw:185-186
###################################################
(eespca.cv.L2 = computeEuclideanDistance(v1, eespca.cv.v1))


###################################################
### code chunk number 20: EESPCA_Example.Rnw:192-193
###################################################
cv.out =  SPC.cv(X, sumabsv=seq(1, sqrt(p), len=20), niter=10, trace=F)


###################################################
### code chunk number 21: EESPCA_Example.Rnw:197-200
###################################################
spc.out=SPC(X, sumabsv=cv.out$bestsumabsv, K=2, trace=F)
spc.out$v
(spc.error = reconstructionError(X, spc.out$v))


###################################################
### code chunk number 22: EESPCA_Example.Rnw:204-207
###################################################
spc.1se.out =SPC(X, sumabsv=cv.out$bestsumabsv1se, K=2, trace=F)
spc.1se.out$v
(spc.1se.error = reconstructionError(X, spc.1se.out$v))


###################################################
### code chunk number 23: EESPCA_Example.Rnw:212-214
###################################################
(spc.L2 = computeEuclideanDistance(v1, spc.out$v[,1]))
(spc.1se.L2 = computeEuclideanDistance(v1, spc.1se.out$v[,1]))


###################################################
### code chunk number 24: EESPCA_Example.Rnw:220-222
###################################################
k.values = round(seq(1, p, len=20))
(optimal.k = tpowerPCACV(X=X, k.values=k.values, nfolds=5))


###################################################
### code chunk number 25: EESPCA_Example.Rnw:226-227
###################################################
v.init = powerIteration(X=S.hat)$v1


###################################################
### code chunk number 26: EESPCA_Example.Rnw:231-239
###################################################
tpower.v1 = tpower(X=S.hat, max.iter=100, k=optimal.k, v1.init=v.init)
X.resid = computeResidualMatrix(X, tpower.v1)
(optimal.k2 = tpowerPCACV(X=X.resid, k.values=k.values, nfolds=5))
X.resid.cov = cov(X.resid)
v2.init = powerIteration(X=X.resid.cov)$v1
tpower.v2 = tpower(X=X.resid.cov, max.iter=100, k=optimal.k2, v1.init=v2.init)
(v = cbind(tpower.v1, tpower.v2))
(tpower.error = reconstructionError(X, v))


###################################################
### code chunk number 27: EESPCA_Example.Rnw:244-245
###################################################
(tpower.L2 = computeEuclideanDistance(v1, tpower.v1))


###################################################
### code chunk number 28: EESPCA_Example.Rnw:251-253
###################################################
k.values = round(seq(1, p, len=20))
(optimal.k = riflePCACV(X=X, k.values=k.values, nfolds=5))


###################################################
### code chunk number 29: EESPCA_Example.Rnw:257-258
###################################################
v.init = rifleInit(X)


###################################################
### code chunk number 30: EESPCA_Example.Rnw:262-270
###################################################
rifle.v1 = rifle(A=S.hat, B=diag(p), init=v.init, k=optimal.k)
X.resid = computeResidualMatrix(X, rifle.v1)
(optimal.k2 = riflePCACV(X=X.resid, k.values=k.values, nfolds=5))
X.resid.cov = cov(X.resid)
v2.init = rifleInit(X.resid)
rifle.v2 = rifle(A=X.resid.cov, B=diag(p), init=v2.init, k=optimal.k2)
(v = cbind(rifle.v1, rifle.v2))
(rifle.error = reconstructionError(X, v))


###################################################
### code chunk number 31: EESPCA_Example.Rnw:274-275
###################################################
(rifle.L2 = computeEuclideanDistance(v1, -rifle.v1))


###################################################
### code chunk number 32: EESPCA_Example.Rnw:280-288
###################################################
estimation.summary = data.frame(pca=c(pca.error, pca.L2),
	spc=c(spc.error, spc.L2),
	spc.1se=c(spc.1se.error, spc.1se.L2),
	eespca=c(eespca.error, eespca.L2),
	tpower=c(tpower.error, tpower.L2),
	rifle=c(rifle.error, rifle.L2))
rownames(estimation.summary) = c("Reconstruction Error", "Loadings distance")
estimation.summary