Nothing
context("Consistency of the Structured Elastic-net (reference is computed via the 'augmented data' approach)")
test_that("Consistency of the structured elastic-net", {
require(elasticnet)
get.coef <- function(x,y,intercept=TRUE,normalize=TRUE,C=diag(rep(1,ncol(x)))) {
lambda2 <- runif(1,0,10)
## INTERCEPT AND NORMALIZATION TREATMENT
if (intercept) {
xbar <- colMeans(x)
ybar <- mean(y)
} else {
xbar <- rep(0,p)
ybar <- 0
}
xs <- scale(x,xbar,FALSE)
ys <- y-ybar
if (normalize) {
normx <- sqrt(drop(colSums(xs^2)))
xs <- scale(xs,FALSE,normx)
} else {
normx <- rep(1,p)
}
## The reference: augmented data approach
x.aug <- rbind(xs,sqrt(lambda2)*C)
y.aug <- c(ys,rep(0,ncol(x)))
senet1 <- enet(x.aug,y.aug,intercept=FALSE,normalize=FALSE,lambda=0)
iols <- length(senet1$penalty)
lambda1 <- senet1$penalty[-iols]/2
## our approach: direct optimization
senet2 <- elastic.net(x,y,intercept=intercept,normalize=normalize,naive=TRUE,
struct=t(C) %*% C, lambda1=lambda1, lambda2=lambda2)
res <- list(
coef.ref = scale(predict(senet1,
type="coefficients",naive=TRUE)$coefficients,FALSE,normx)[-iols,],
coef.our = as.matrix(senet2@coefficients))
return(res)
}
## PROSTATE DATA SET
load("prostate.rda")
x <- as.matrix(x)
p <- ncol(x)
## Simple Elastic.net: structuring matrix is the indentity
C <- diag(rep(1,p))
out <- get.coef(x,y,C=C)
expect_that(out$coef.our,is_equivalent_to(out$coef.ref))
## Structured Elastic.net
C <- as.matrix(bandSparse(p,k=0:1,diagonals=list(rep(1,p),rep(-1,p-1))))
## with intercept and normalization
out <- get.coef(x,y,intercept=TRUE,normalize=TRUE,C=C)
expect_that(out$coef.our,is_equivalent_to(out$coef.ref))
## without intercept, with normalization
out <- get.coef(x,y,intercept=FALSE,normalize=TRUE,C=C)
expect_that(out$coef.our,is_equivalent_to(out$coef.ref))
## without intercept, without normalization
out <- get.coef(x,y,intercept=FALSE,normalize=FALSE,C=C)
expect_that(out$coef.our,is_equivalent_to(out$coef.ref))
## with intercept, without normalization
out <- get.coef(x,y,intercept=TRUE,normalize=FALSE,C=C)
expect_that(out$coef.our,is_equivalent_to(out$coef.ref))
## RANDOM DATA
seed <- sample(1:10000,1)
## cat(" #seed=",seed)
set.seed(seed)
beta <- rep(c(0,1,0,-1,0), c(25,10,25,10,25))
n <- 100
p <- length(beta)
mu <- 3 # intercept
sigma <- 30 # huge noise
Sigma <- matrix(0.95,p,p) # huge correlation
diag(Sigma) <- 1
x <- as.matrix(matrix(rnorm(95*n),n,95) %*% chol(Sigma))
y <- 10 + x %*% beta + rnorm(n,0,10)
## Run the tests...
## Simple Elastic.net: structuring matrix is the indentity
C <- diag(rep(1,p))
out <- get.coef(x,y,C=C)
expect_that(out$coef.our,is_equivalent_to(out$coef.ref))
## Structured Elastic.net
C <- as.matrix(bandSparse(p,k=0:1,diagonals=list(rep(1,p),rep(-1,p-1))))
## with intercept and normalization
out <- get.coef(x,y,intercept=TRUE,normalize=TRUE,C=C)
expect_that(out$coef.our,is_equivalent_to(out$coef.ref))
## without intercept, with normalization
out <- get.coef(x,y,intercept=FALSE,normalize=TRUE,C=C)
expect_that(out$coef.our,is_equivalent_to(out$coef.ref))
## without intercept, without normalization
out <- get.coef(x,y,intercept=FALSE,normalize=FALSE,C=C)
expect_that(out$coef.our,is_equivalent_to(out$coef.ref))
## with intercept, without normalization
out <- get.coef(x,y,intercept=TRUE,normalize=FALSE,C=C)
expect_that(out$coef.our,is_equivalent_to(out$coef.ref))
})
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.