## ----setup, include = FALSE--------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ## ----message = FALSE---------------------------------------------------------- library(oalasso) set.seed(20260702) n <- 300 X <- matrix(rnorm(n * 6), n, 6, dimnames = list(NULL, paste0("x", 1:6))) A <- rbinom(n, 1, plogis(X %*% c(1, 1, 0, 0, 1, 1))) Y <- as.numeric(2 * A + X %*% c(0.6, 0.6, 0.6, 0.6, 0, 0) + rnorm(n)) sim <- data.frame(A, Y, X) fit <- oal(A ~ x1 + x2 + x3 + x4 + x5 + x6, data = sim, outcome = ~ Y) ## the path records, per grid point: lambda2, delta, lambda.n = n^delta, ## the paired gamma = 2*(2 - delta + 1), the exact glmnet s actually used, ## the wAMD, and the selected-set size fit$path[, c("delta", "lambda.n", "gamma", "s", "wamd", "n.selected")] all.equal(fit$path$gamma, 2 * (2 - fit$path$delta + 1)) ## ----eval = FALSE------------------------------------------------------------- # oal(A ~ ., data = dat, outcome = ~ y, # lambda = c(-10, -5, -2, -1, -0.75, -0.5, -0.25, 0.25, 0.49) + 0.5) ## ----eval = FALSE------------------------------------------------------------- # ## Reference construction: what oal() computes internally # f <- A ~ x1 + x2 + x3 + x4 + x5 + x6 # X <- model.matrix(f, sim)[, -1, drop = FALSE] # Xs <- scale(X, TRUE, TRUE) # the package's fixed protocol # b <- coef(lm(sim$Y ~ sim$A + Xs))[-(1:2)] # drop intercept and treatment # names(b) <- colnames(Xs) # fit.hook <- oal(f, data = sim, outcome.coef = b) # same selections as outcome = ~ Y # # (provenance label differs) # # ## Ridge outcome model for p close to n # set.seed(1) # cv.glmnet folds are random # cv <- glmnet::cv.glmnet(x = cbind(A = sim$A, Xs), y = sim$Y, alpha = 0, # penalty.factor = c(0, rep(1, ncol(Xs)))) # b <- as.numeric(coef(cv, s = "lambda.min"))[-(1:2)] # names(b) <- colnames(Xs) # fit.ridge <- oal(f, data = sim, outcome.coef = b) ## ----eval = FALSE------------------------------------------------------------- # ## EXPERIMENTAL — screening use only, per the ten points above. Requires `party`. # library(party) # # f <- A ~ x1 + x2 + x3 + x4 + x5 + x6 # X <- model.matrix(f, sim)[, -1, drop = FALSE] # Xs <- scale(X, TRUE, TRUE) # same standardization as oal() # df <- data.frame(Y = sim$Y, Xs, check.names = FALSE) # # set.seed(20260702) # forests are stochastic # cf <- cforest(reformulate(colnames(Xs), response = "Y"), data = df, # controls = cforest_unbiased(ntree = 1000, # mtry = ceiling(sqrt(ncol(Xs))))) # vi <- varimp(cf, conditional = TRUE) # conditional permutation importance # vi <- pmax(vi[colnames(Xs)], 0) # negative importance -> 0 = hard exclusion # # fit.imp <- oal(f, data = sim, outcome.coef = vi) # fit.imp # provenance line flags the user-supplied weights; screening use only