Nothing
## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, python.reticulate=FALSE)
## ----tidy=FALSE, eval=FALSE, highlight=FALSE----------------------------------
# Input initial point (A0,B0) and necessary parameters for the required problem
#
# for i=0,1,... do
# Solve the first subproblem for Da
# Set alpha = 1
#
# while F(Retr(alpha * Da),B) > F(A,B) - alpha * norm(Da)^2 / (2 * t1) do
# alpha = gamma * alpha
# end while
#
# Set A = Retr(alpha * Da)
#
# Solve the second subproblem for Db
# Set alpha = 1
#
# while F(A,Retr(alpha * Db)) > F(A,B) - alpha * norm(Db)^2 / (2 * t2) do
# alpha = gamma * alpha
# end while
#
# Set B = Retr(alpha * Db)
# end for
#
# Return A as the scores and B as the sparse loadings
## ----eval=FALSE, highlight=TRUE-----------------------------------------------
# install.packages("amanpg")
## ----eval=FALSE, highlight=TRUE-----------------------------------------------
# spca.amanpg(z, lambda1, lambda2,
# f_palm = 1e5, x0 = NULL, y0 = NULL, k = 0, type = 0,
# gamma = 0.5, maxiter = 1e4, tol = 1e-5,
# normalize = TRUE, verbose = FALSE)
## -----------------------------------------------------------------------------
library(amanpg)
## -----------------------------------------------------------------------------
# parameter initialization
k <- 4
n <- 1000
p <- 500
lambda1 <- matrix(data=0.1, nrow=k, ncol=1)
lambda2 <- 1
## -----------------------------------------------------------------------------
# data matrix generation
set.seed(10)
z <- matrix(rnorm(n * p), n, p)
# only show a subset of the data matrix for brevity
knitr::kable(as.data.frame(z)[1:10,1:4])
## -----------------------------------------------------------------------------
# see the effects of normalize()
knitr::kable(as.data.frame(normalize(z))[1:10,1:4])
## -----------------------------------------------------------------------------
# function call
fin_sprout <- spca.amanpg(z, lambda1, lambda2, k=4)
print(paste(fin_sprout$iter, "iterations,", fin_sprout$sparsity, "sparsity,", fin_sprout$time))
## -----------------------------------------------------------------------------
# View loadings. Only first 10 rows for brevity
knitr::kable(as.data.frame(fin_sprout$loadings)[1:10,])
## ----fig.align='center', fig.cap="Scree plots for the finite lambda case."----
pr.var <- (apply(fin_sprout$x, 2, sd))^2
pve <- pr.var / sum(pr.var)
par(mfrow=c(1,2))
plot(pve,
xlab="Sparse PC",
ylab="Proportion of Variance Explained",
ylim=c(0,1),
type="b")
plot(cumsum(pve),
xlab="Sparse PC",
ylab="Cumulative Proportion of Variance Explained",
ylim=c(0,1),
type="b")
## ----fig.align='center', fig.cap="Biplot for the finite lambda case."---------
y_sub = apply(fin_sprout$loadings, 1, function(row) all(row != 0))
loadings = fin_sprout$loadings[y_sub, ]
par(mfrow=c(1,1))
biplot(fin_sprout$x, loadings, xlab="PC 1", ylab="PC 2")
## -----------------------------------------------------------------------------
# infinite lambda2
inf_sprout <- spca.amanpg(z, lambda1, lambda2=Inf, k=4)
print(paste(inf_sprout$iter, "iterations,", inf_sprout$sparsity, "sparsity,", inf_sprout$time))
# extract loadings. Only first 10 rows for brevity
knitr::kable(as.data.frame(inf_sprout$loadings)[1:10,])
## ----fig.align='center', fig.cap="Scree plot for lambda=inf case."------------
pr.var <- (apply(inf_sprout$x, 2, sd))^2
pve <- pr.var / sum(pr.var)
par(mfrow=c(1,2))
plot(pve,
xlab="Sparse PC",
ylab="Proportion of Variance Explained",
ylim=c(0,1),
type="b")
plot(cumsum(pve),
xlab="Sparse PC",
ylab="Cumulative Proportion of Variance Explained",
ylim=c(0,1),
type="b")
## ----fig.align='center', fig.cap="Biplot for lambda=inf case. Observe that with lower sparsity in the loadings and high-dimensional data, the biplot becomes less readable."----
y_sub = apply(inf_sprout$loadings, 1, function(row) all(row != 0))
loadings = inf_sprout$loadings[y_sub, ]
par(mfrow=c(1,1))
biplot(inf_sprout$x, loadings, xlab="PC 1", ylab="PC 2")
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.