## ----gw-knit-opts, include = FALSE-------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 6, fig.height = 4, fig.align = "center" ) ## ----setup-------------------------------------------------------------------- library(MetaHunt) set.seed(1) ## ----sim-data----------------------------------------------------------------- m <- 40 G <- 30 x <- seq(0, 1, length.out = G) # True bases on the grid. basis <- rbind(sin(pi * x), cos(pi * x), x) # Mixing weights driven by two latent covariates. W <- data.frame(w1 = rnorm(m), w2 = rnorm(m)) beta <- cbind(c(1, -0.8), c(-0.5, 1.2), c(0, 0)) eta <- as.matrix(W) %*% beta pi_true <- exp(eta) / rowSums(exp(eta)) F_hat <- pi_true %*% basis + matrix(rnorm(m * G, sd = 0.05), m, G) dim(F_hat) ## ----two-weights-------------------------------------------------------------- gw_uniform <- rep(1 / G, G) # Up-weight x > 0.5 by ~5x. Renormalisation is optional but tidy. gw_right <- ifelse(x > 0.5, 5, 1) gw_right <- gw_right / sum(gw_right) * G # comparable scale, optional fit_unif <- dfspa(F_hat, K = 3, grid_weights = gw_uniform, denoise = FALSE) fit_right <- dfspa(F_hat, K = 3, grid_weights = gw_right, denoise = FALSE) # Index sets selected can differ. fit_unif$original_indices fit_right$original_indices ## ----overlay-plot------------------------------------------------------------- matplot( x, cbind(fit_unif$bases[1, ], fit_right$bases[1, ]), type = "l", lty = 1, lwd = 2, col = c("#0072B2", "#D55E00"), xlab = "x", ylab = "first recovered basis", main = expression( "Recovered first-vertex basis under uniform vs. target-weighted " ~ L^2 * (mu) ) ) abline(v = 0.5, lty = 2, col = "grey60") legend("topright", legend = c("uniform", "up-weight x > 0.5", "x = 0.5 boundary"), col = c("#0072B2", "#D55E00", "grey60"), lty = c(1, 1, 2), lwd = c(2, 2, 1), bty = "n")