# oalasso 1.0.0

Initial release, implementing the outcome-adaptive lasso of Shortreed & Ertefaie (2017), *Biometrics* 73(4):1111–1122, doi:10.1111/biom.12679, and the generalized outcome-adaptive lasso (GOAL) of Baldé, Yang & Lefebvre (2023), *Biometrics* 79(1):514–520, doi:10.1111/biom.13683.

* `oal()`: outcome-adaptive lasso propensity scores. Adaptive penalty weights `|b_j|^-gamma` from an unpenalized outcome model `Y ~ A + X` on the full sample (`gaussian()` validated; `binomial()` allowed with a one-time warning, GLM theory per Baldé 2025, doi:10.1016/j.spl.2025.110379); tuning over Shortreed & Ertefaie's exponent grid `lambda_n = n^delta` with the paired penalty exponent `gamma = 2*(gamma.factor - delta + 1)`; selection by the weighted absolute mean difference (wAMD) with `|b_j|` weights, ATE (default) or ATT weighting; ties take the first minimum in documented grid order.
* Exact reproduction of the published objective on `glmnet`: every grid point is evaluated at `s = mean(pen) * lambda_n / n` with `coef(..., exact = TRUE)`, undoing glmnet's internal sum-to-nvars penalty-factor rescaling and its per-observation loss scale (the rejoinder recipe of Jones, Ertefaie & Shortreed 2023, doi:10.1111/biom.13681). The KKT conditions of the target objective are the acceptance criterion in the test suite, with a drift guard against the installed glmnet version.
* `method = "goal"`: Baldé's elastic-net generalization via the Zou–Hastie data augmentation with the `(1 + lambda2)` rescale of ALL coefficients including the intercept (Baldé 2025 supplement: `expit(cbind(1, X) %*% (1 + lambda2) * coef)`); on augmented grid points (`lambda2 > 0`) the raw penalty constant is `(n + q)^delta` with `q = p` augmentation rows, matching the author's `adaptive.lasso(lambda = n.q^(il))` with `n.q = n + q`. `lambda2` is selected jointly with `(delta, gamma)` by the wAMD — the flat first-minimum, equivalent to Baldé's nested per-`lambda2`-then-over-`lambda2` rule — and `lambda2 = 0` exactly nests plain OAL (no augmentation on that code path). The default `lambda2` grid `c(0, 10^c(-2, -1.5, -1, -0.75, -0.5, -0.25, 0, 0.25, 0.5, 1))` is the author's published grid (Baldé 2025 supplement, "taken from Zou and Hastie (2005)"), verified against the official GOAL code on 2026-07-02.
* Baldé's reference code runs UNCLIPPED IPW weights; the default `clip = c(0.01, 0.99)` is a Shortreed–Ertefaie-lineage safety choice, and `clip = c(1e-12, 1 - 1e-12)` effectively disables clipping to reproduce the reference behavior.
* Fixed standardization protocol: covariates are standardized once (training statistics, all columns including dummies); the outcome model and glmnet fit on the same matrix with `standardize = FALSE`; coefficients returned on both scales.
* Options with provenance labels printed on every fit: `refit = TRUE` (post-selection unpenalized refit, Schnitzer et al. 2025, doi:10.1002/sim.70316, adapted from a longitudinal setting; convergence recorded per grid point), scalar `gamma` (Schnitzer-style fixed exponent crossed with the delta grid), and the `outcome.coef` hook (user-supplied weights on the standardized scale — screening use only; zeros become hard exclusions via glmnet's Inf-to-exclude).
* Ecosystem integration: `fit$ps` (numeric, named by `rownames(data)`, clipped to `clip = c(0.01, 0.99)`) drops into `MatchIt::matchit(distance = )`, `WeightIt::weightit(ps = )`, and `psAve::psave(ps.append = )`; `oal_match()` / `oal_weight()` wrappers reuse the stored formula and data; `cobalt::bal.tab()` works on `oal` objects.
* Full S3 suite: `print()` (provenance line first; retained vs excluded covariates with the instrument-exclusion rationale of Brookhart et al. 2006 and Myers et al. 2011; the literal next call; near-positivity diagnostic when > 5% of scores sit at a clip bound), `summary()`, `plot()` (`"wamd"`, `"coef"`, `"balance"`), `coef()` (both scales), `predict()` (works without `keep.fits`), `weights()`.
* Exported criterion: `oal_wamd()` scores any candidate propensity score on the exact S&E wAMD formula (single source of truth; never delegated to cobalt).
* Policies: any `NA` in used variables is an error naming the variables (never a silent drop); zero-variance and aliased/rank-deficient covariates error; fully deterministic pipeline (no seed argument); English-only messages.
* Documented divergences from the author's legacy `fAL`/`fOAL` code (which is superseded, not reproduced): the `fAL` gamma transcription bug, the `varlist` wAMD bug, global-`n` scoping, per-subset `scale()`, and the archived `lqa` dependency. See `vignette("method-details", package = "oalasso")`.
* Three vignettes: Getting Started (matching and weighting workflows, reading the output), Using oalasso with psAve (the `ps.append` composition and its caveats), and Method details and provenance (all formulas, the exact penalty-scale correction, provenance table, relation to other software, honest nonlinear-extension notes).
