## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", message = FALSE, warning = FALSE ) ## ----------------------------------------------------------------------------- set.seed(123) library(NMAR) N <- 500 X <- rnorm(N) eps <- rnorm(N) Y <- 2 + 0.5 * X + eps # NMAR response: depends on Y p <- plogis(-1.0 + 0.4 * scale(Y)[, 1]) R <- runif(N) < p dat <- data.frame(Y_miss = Y, X = X) dat$Y_miss[!R] <- NA_real_ ## ----------------------------------------------------------------------------- engine <- el_engine(auxiliary_means = c(X = 0), variance_method = "none", standardize = TRUE) # Fit EL estimator (no variance for speed in vignette) fit <- nmar( formula = Y_miss ~ X, data = dat, engine = engine ) summary(fit) # For confidence intervals, use bootstrap variance (see example below). ## ----------------------------------------------------------------------------- engine <- el_engine(auxiliary_means = c(X = 0), family = "probit", variance_method = "none", standardize = TRUE) fit_probit <- nmar( formula = Y_miss ~ X, engine = engine, data = dat ) summary(fit_probit) ## ----------------------------------------------------------------------------- generics::tidy(fit) generics::glance(fit) ## ----------------------------------------------------------------------------- head(weights(fit), 10) head(weights(fit, scale = "population"), 10) head(fitted(fit), 10) fit$diagnostics[c( "max_equation_residual", "jacobian_condition_number", "trimmed_fraction", "min_denominator", "fraction_small_denominators" )] ## ----eval = requireNamespace("future.apply", quietly = TRUE)------------------ set.seed(123) engine <- el_engine( auxiliary_means = c(X = 0), variance_method = "bootstrap", bootstrap_reps = 10, standardize = TRUE ) fit_boot <- nmar( formula = Y_miss ~ X, engine = engine, data = dat ) se(fit_boot) confint(fit_boot) ## ----------------------------------------------------------------------------- set.seed(124) N <- 300 X <- rnorm(N); eps <- rnorm(N); Y <- 1.5 + 0.4 * X + eps p <- plogis(-0.5 + 0.4 * scale(Y)[, 1]) R <- runif(N) < p df_resp <- subset(data.frame(Y_miss = Y, X = X), R == 1) eng_resp <- el_engine(auxiliary_means = c(X = 0), variance_method = "none", n_total = N) fit_resp <- nmar(Y_miss ~ X, data = df_resp, engine = eng_resp) summary(fit_resp) ## ----------------------------------------------------------------------------- set.seed(125) N <- 400 X <- rnorm(N) Z <- rnorm(N) Y <- 1 + 0.6 * X + 0.3 * Z + rnorm(N) p <- plogis(-0.6 + 0.5 * scale(Y)[, 1] + 0.4 * Z) R <- runif(N) < p df2 <- data.frame(Y_miss = Y, X = X, Z = Z) df2$Y_miss[!R] <- NA_real_ engine <- el_engine(auxiliary_means = c(X = 0), variance_method = "none", standardize = TRUE) # Use X as auxiliary (known population mean 0), and Z as response-only predictor fit_resp_only <- nmar( formula = Y_miss ~ X | Z, data = df2, engine = engine ) summary(fit_resp_only) ## ----eval = requireNamespace("survey", quietly = TRUE)------------------------ suppressPackageStartupMessages(library(survey)) data(api, package = "survey") set.seed(42) apiclus1$api00_miss <- apiclus1$api00 ystd <- scale(apiclus1$api00)[, 1] prob <- plogis(-0.5 + 0.4 * ystd + 0.2 * scale(apiclus1$ell)[, 1]) miss <- runif(nrow(apiclus1)) > prob apiclus1$api00_miss[miss] <- NA_real_ dclus1 <- svydesign(id = ~dnum, weights = ~pw, data = apiclus1, fpc = ~fpc) # Let the engine infer auxiliary means from the full design (design-weighted). # Alternatively, you can supply known population means via auxiliary_means. engine <- el_engine(auxiliary_means = NULL, variance_method = "none", standardize = TRUE) fit_svy <- nmar( formula = api00_miss ~ ell | ell, data = dclus1, engine = engine ) summary(fit_svy) ## ----------------------------------------------------------------------------- ctrl <- list(maxit = 200, xtol = 1e-10, ftol = 1e-10) eng_ctrl <- el_engine(auxiliary_means = c(X = 0), variance_method = "none", control = ctrl) invisible(nmar(Y_miss ~ X, data = dat, engine = eng_ctrl)) ## ----------------------------------------------------------------------------- sessionInfo()