tests/testthat/test-WPL1.R

test_that("WPL1 refers to W2L1 appropriately", {
  set.seed(283947)

  n <- 32
  p <- 10
  s <- 21

  x <- matrix(stats::rnorm(p*n), nrow=n, ncol=p)
  beta <- (1:10)/10
  y <- x %*% beta + stats::rnorm(n)

  #posterior
  prec <- crossprod(x) + diag(1,p,p)*1
  mu_post <- solve(prec, crossprod(x,y))
  alpha <- 1 + n/2
  beta <- 1 + 0.5 * (crossprod(y) + t(mu_post) %*% prec %*% mu_post )
  sigma_post <- 1/stats::rgamma(s, alpha, 1/beta)
  theta <- sapply(sigma_post, function(ss) mu_post + t(chol(ss * solve(prec))) %*% matrix(stats::rnorm(p, 0, 1),p,1))

  post_mu <- x %*% theta
  post_diff <- matrix(c(y),nrow=n,ncol=s) + matrix(stats::rnorm(s*n,0,0.01),nrow=n,ncol=s)
  post_vdiff <- matrix(stats::rnorm(n*s),nrow=n,ncol=s)
  xtx <- crossprod(x)/n
  xty <- crossprod(x, post_mu)/n
  lambda <- 0
  nlambda <- 100
  lambda.min.ratio <- 1e-10
  gamma <- 1
  penalty.factor <- 1/rowMeans(theta^2)
  penalty.factor.null <- rep(1,p)
  transp <- "hilbert"
  # print(x)
  projectionols <- WpProj:::WPL1(X=x, Y=NULL, power = 2.0,
                        theta=theta, penalty="ols",
                        nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                        infimum.maxit=1, maxit = 1e3, gamma = gamma,
                        display.progress = FALSE, lambda=lambda,
                        penalty.factor = penalty.factor.null, method="projection",
                        tol = 0)
  testthat::expect_equal(c(projectionols$beta), c(theta)) #should be pretty close
  testthat::expect_equal(c(projectionols$beta), c(coef(lm(post_mu ~ x + 0))))#should be pretty close
  testthat::expect_equal(c(theta), c(coef(lm(post_mu ~ x + 0))))#should be pretty close

  projectionmcp <- WpProj:::WPL1(X=x, Y=NULL, power = 2.0,
                        theta=theta, penalty="mcp",
                        nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                        infimum.maxit=1, maxit = 1e3, gamma = gamma,
                        display.progress = FALSE, lambda=lambda,
                        penalty.factor = penalty.factor.null, method="projection",
                        tol = 0)
  testthat::expect_equal(c(projectionmcp$beta[,2]), c(theta)) #should be pretty close
  testthat::expect_equal(c(projectionmcp$beta[,1]), c(theta)) #should be pretty close
  testthat::expect_equal(c(projectionmcp$beta[,1]), c(projectionols$beta)) #should be pretty close


  projectionscad <- WpProj:::WPL1(X=x, Y=NULL, power = 2.0,
                         theta=theta, penalty="scad",
                         nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                         infimum.maxit=1, maxit = 1e3, gamma = gamma,
                         display.progress = FALSE, lambda=lambda,
                         penalty.factor = penalty.factor, method="projection",
                         tol = 0)
  testthat::expect_equal(c(projectionscad$beta[,2]), c(theta)) #should be pretty close
  testthat::expect_equal(c(projectionscad$beta[,1]), c(theta)) #should be pretty close


  projectionlasso <- WpProj:::WPL1(X=x, Y=NULL, power = 2.0,
                          theta=theta, penalty="lasso",
                          nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                          infimum.maxit=1, maxit = 1e3, gamma = gamma,
                          display.progress = FALSE, lambda = lambda,
                          penalty.factor = penalty.factor, method="projection",
                          tol= 0)
  testthat::expect_equal(c(projectionlasso$beta[,2]), c(theta)) #should be pretty close
  testthat::expect_equal(c(projectionlasso$beta[,1]), c(theta)) #should be pretty close

  projectionlasso <- WpProj:::WPL1(X=x, Y=NULL, power = 2.0,
                          theta=theta, penalty="lasso",
                          nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                          infimum.maxit=1, maxit = 1e3, gamma = gamma,
                          display.progress = FALSE,
                          penalty.factor = penalty.factor, method="projection",
                          tol = 0)
  testthat::expect_equal(c(projectionlasso$beta[,101]), c(theta)) #should be pretty close

  
  testthat::skip_on_cran()
  #should warn about infimum
  if(Sys.info()['machine'] == "arm64") {
    testthat::expect_silent(WpProj:::WPL1(X=x, Y=NULL, power = 2.0,
                                          theta=theta, penalty="lasso",
                                          nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                                          infimum.maxit=1, maxit = 1, gamma = gamma,
                                          display.progress = FALSE,
                                          penalty.factor = penalty.factor, method="projection"))
  } else {
    testthat::expect_warning(WpProj:::WPL1(X=x, Y=NULL, power = 2.0,
                                          theta=theta, penalty="lasso",
                                          nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                                          infimum.maxit=1, maxit = 1, gamma = gamma,
                                          display.progress = FALSE,
                                          penalty.factor = penalty.factor, method="projection"))
  }
  
})

testthat::test_that("WPL1 works for Wp", {
  set.seed(87897)
  
  n <- 32
  p <- 10
  s <- 21
  
  x <- matrix(stats::rnorm(p*n), nrow=n, ncol=p)
  beta <- (1:10)/10
  y <- x %*% beta + stats::rnorm(n)
  
  #posterior
  prec <- crossprod(x) + diag(1,p,p)*1
  mu_post <- solve(prec, crossprod(x,y))
  alpha <- 1 + n/2
  beta <- 1 + 0.5 * (crossprod(y) + t(mu_post) %*% prec %*% mu_post )
  sigma_post <- 1/stats::rgamma(s, alpha, 1/beta)
  theta <- sapply(sigma_post, function(ss) mu_post + t(chol(ss * solve(prec))) %*% matrix(stats::rnorm(p, 0, 1),p,1))
  
  lambda <- 0
  nlambda <- 3
  lmr <- 1e-10
  gamma <- 1.5
  penalty.factor <- 1/rowMeans(theta^2)
  penalty.factor.null <- rep(1,p)
  post_mu <- x %*% theta
  # debugonce(W1L1)
  # projectionmcp <- W1L1(X=x, Y=post_mu, penalty="mcp",
  #                       nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
  #                       maxit = 1e2, gamma = gamma,
  #                       lambda=NULL)
  testthat::expect_silent(projectionmcp <- WpProj:::WPL1(X=x, Y=post_mu, penalty="mcp", p = 3,
                                                nlambda = nlambda, lambda.min.ratio = lmr,
                                                maxit = 5, gamma = gamma,
                                                lambda=NULL))
  testthat::expect_lte(mean(c(projectionmcp$beta[,3]) - c(theta)), 1e-7)
  
  testthat::skip_on_cran()
  
  testthat::expect_silent(projectionols <- 
                            WpProj:::WPL1(X=x, Y=post_mu, power = 3.0,
                                          maxit = 5,
                                 theta=NULL, penalty="ols", lambda.min.ratio = lmr,
                                 lambda=lambda))
  
  testthat::expect_lte(mean(c(projectionols$beta)-c(theta)), 1e-7) #should be pretty close
  
  testthat::expect_silent(projectionscad <- 
                            WpProj:::WPL1(X=x, Y=NULL, power = 3,
                                 theta=theta, penalty="scad",
                                 maxit = 5,
                                 nlambda = nlambda, lambda.min.ratio = lmr,
                                 lambda=NULL))
  testthat::expect_lte(mean(c(projectionscad$beta[,3])-c(theta)), 1e-7) #should be pretty close
  
  testthat::expect_silent(projectionlasso <-  WpProj:::WPL1(X=x, Y=NULL, power = 3,
                                                  theta=theta, penalty="lasso",
                                                  maxit = 5,
                                                  nlambda = nlambda, lambda = NULL))
  testthat::expect_lte(mean(c(projectionlasso$beta[,3])-c(theta)), 1e-5) #should be pretty close
  
  
  
})

testthat::test_that("WPL1 works for W1", {
  
  set.seed(87897)

  n <- 32
  p <- 10
  s <- 21

  x <- matrix(stats::rnorm(p*n), nrow=n, ncol=p)
  beta <- (1:10)/10
  y <- x %*% beta + stats::rnorm(n)

  #posterior
  prec <- crossprod(x) + diag(1,p,p)*1
  mu_post <- solve(prec, crossprod(x,y))
  alpha <- 1 + n/2
  beta <- 1 + 0.5 * (crossprod(y) + t(mu_post) %*% prec %*% mu_post )
  sigma_post <- 1/stats::rgamma(s, alpha, 1/beta)
  theta <- sapply(sigma_post, function(ss) mu_post + t(chol(ss * solve(prec))) %*% matrix(stats::rnorm(p, 0, 1),p,1))

  lambda <- 0
  nlambda <- 3
  lambda.min.ratio <- 1e-10
  gamma <- 1.5
  penalty.factor <- 1/rowMeans(theta^2)
  penalty.factor.null <- rep(1,p)
  post_mu <- x %*% theta
  # debugonce(W1L1)
  # projectionmcp <- W1L1(X=x, Y=post_mu, penalty="mcp",
  #                       nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
  #                       maxit = 1e2, gamma = gamma,
  #                       lambda=NULL)
  
  testthat::expect_silent(projectionmcp1 <- WpProj:::W1L1(X=x, Y=post_mu, penalty="mcp",
                                  nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                                  maxit = 5, gamma = gamma,
                                  lambda=NULL))
  testthat::expect_silent(projectionmcp2 <- WpProj:::WPL1(X=x, Y=post_mu, penalty="mcp", p = 1,
                                  nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                                  maxit = 5, gamma = gamma,
                                  lambda=NULL))
  
  testthat::skip_on_cran()
  
  projectionmcp1 <- WpProj:::W1L1(X=x, Y=post_mu, penalty="mcp",
                         nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                         maxit = 5, gamma = gamma,
                         lambda=NULL)
  projectionmcp2 <- WpProj:::WPL1(X=x, Y=post_mu, penalty="mcp", p = 1,
                        nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                        maxit = 5, gamma = gamma,
                        lambda=NULL)
  # testthat::expect_equal(c(projectionmcp1$beta[,3]), c(projectionmcp2$beta[,3]))#should be pretty close
  
  projectionols1 <- WpProj:::W1L1(X=x, Y=post_mu, penalty="ols",
                                nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                                maxit = 5, gamma = gamma,
                                lambda=lambda)

  projectionols2 <- WpProj:::WPL1(X=x, Y=post_mu, power = 1.0, maxit = 5,
                        theta=NULL, penalty="ols",
                        lambda=lambda)

  # testthat::expect_equivalent(c(projectionols1$beta), c(theta)) #should be pretty close
  # testthat::expect_equal(c(projectionols1$beta), c(projectionols2$beta))#should be pretty close


  projectionscad1 <- WpProj:::W1L1(X=x, Y=NULL,
                         theta=theta, penalty="scad",
                         nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                         lambda=NULL)
  projectionscad2 <- WpProj:::WPL1(X=x, Y=NULL, power = 1.0,
                         theta=theta, penalty="scad", maxit = 5,
                         nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                         lambda=NULL)
  # testthat::expect_equivalent(c(projectionscad1$beta[,1]), c(projectionscad2$beta[,1])) #should be pretty close


  projectionlasso1 <- WpProj:::W1L1(X=x, Y=NULL, power = 1.0,
                          theta=theta, penalty="lasso",
                          nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                          gamma = gamma,
                          lambda = NULL)
  projectionlasso2 <- WpProj:::WPL1(X=x, Y=NULL, power = 1.0, maxit = 5,
                           theta=theta, penalty="lasso",
                           nlambda = nlambda, lambda = NULL)
  # testthat::expect_equal(c(projectionlasso1$beta[,1]), c(projectionlasso2$beta[,1])) #should be pretty close

})

testthat::test_that("WPL1 works for WInf", {
  
  set.seed(87897)
  
  n <- 32
  p <- 10
  s <- 21
  
  x <- matrix(stats::rnorm(p*n), nrow=n, ncol=p)
  beta <- (1:10)/10
  y <- x %*% beta + stats::rnorm(n)
  
  #posterior
  prec <- crossprod(x) + diag(1,p,p)*1
  mu_post <- solve(prec, crossprod(x,y))
  alpha <- 1 + n/2
  beta <- 1 + 0.5 * (crossprod(y) + t(mu_post) %*% prec %*% mu_post )
  sigma_post <- 1/stats::rgamma(s, alpha, 1/beta)
  theta <- sapply(sigma_post, function(ss) mu_post + t(chol(ss * solve(prec))) %*% matrix(stats::rnorm(p, 0, 1),p,1))
  
  lambda <- 0
  nlambda <- 3
  lambda.min.ratio <- 1e-10
  gamma <- 1.5
  penalty.factor <- 1/rowMeans(theta^2)
  penalty.factor.null <- rep(1,p)
  post_mu <- x %*% theta
  # debugonce(W1L1)
  # projectionmcp <- W1L1(X=x, Y=post_mu, penalty="mcp",
  #                       nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
  #                       maxit = 1e2, gamma = gamma,
  #                       lambda=NULL)
  testthat::expect_silent(projectionmcp1 <- WpProj:::WInfL1(X=x, Y=post_mu, penalty="mcp",
                         nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                         maxit = 5, gamma = gamma,
                         lambda=NULL))
  testthat::expect_silent(projectionmcp2 <- WpProj:::WPL1(X=x, Y=post_mu, penalty="mcp", power = Inf,
                         nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
                         maxit = 5, gamma = gamma,
                         lambda=NULL))
  # testthat::expect_equal(c(projectionmcp1$beta[,3]), c(projectionmcp2$beta[,3]))#should be pretty close
  
  # testthat::skip_on_cran()
  # projectionols1 <- WInfL1(X=x, Y=post_mu, penalty="ols",
  #                        nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
  #                        maxit = 1e2, gamma = gamma,
  #                        lambda=lambda)
  # 
  # projectionols2 <- WPL1(X=x, Y=post_mu, power = Inf,
  #                        theta=NULL, penalty="ols",
  #                        lambda=lambda)
  # 
  # testthat::expect_equivalent(c(projectionols1$beta), c(theta)) #should be pretty close
  # testthat::expect_equal(c(projectionols1$beta), c(projectionols2$beta))#should be pretty close
  # 
  # 
  # projectionscad1 <- WInfL1(X=x, Y=NULL,
  #                         theta=theta, penalty="scad",
  #                         nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
  #                         lambda=NULL)
  # projectionscad2 <- WPL1(X=x, Y=NULL, power = Inf,
  #                         theta=theta, penalty="scad",
  #                         nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
  #                         lambda=NULL)
  # testthat::expect_equivalent(c(projectionscad1$beta[,2]), c(projectionscad2$beta[,2])) #should be pretty close
  # 
  # 
  # projectionlasso1 <- WInfL1(X=x, Y=NULL,
  #                          theta=theta, penalty="lasso",
  #                          nlambda = nlambda, lambda.min.ratio = lambda.min.ratio,
  #                          gamma = gamma,
  #                          lambda = NULL)
  # projectionlasso2 <- WPL1(X=x, Y=NULL, power = Inf,
  #                          theta=theta, penalty="lasso", lambda.min.ratio = lambda.min.ratio,
  #                          nlambda = nlambda, lambda = NULL)
  # testthat::expect_equal(c(projectionlasso1$beta[,2]), c(projectionlasso2$beta[,2])) #should be pretty close
  
})
ericdunipace/limbs documentation built on June 11, 2025, 9:50 a.m.