Skip to contents
library(activesampling)
library(dplyr)
library(ggplot2)
set.seed(42)

data(zimbabwe_minisample)
pop <- zimbabwe_minisample %>% slice(1:4000)
strata <- c("gender","region")
outcome <- "fcs_insuff_flag"
param_grid <- expand.grid(
  method = c("alsd_simple","alsd_modelled"),
  pi_mean = c(0.08, 0.15),
  wave_size = c(100, 150),
  KEEP.OUT.ATTRS = FALSE
)

run_one <- function(row) {
  df <- pop
  # Rescale pi_true mean to match desired pi_mean (rough approximation)
  m <- mean(df$pi_true)
  if (!is.na(m) && m > 0 && m < 1) {
    scale <- row[["pi_mean"]] / m
    df$pi_true <- pmax(pmin(df$pi_true * scale, 0.95), 0.01)
  }
  res <- run_alsd_simulation(
    population_df = df,
    strata_vars = strata,
    outcome_var = outcome,
    method = row[["method"]],
    initial_sample_size = 200,
    wave_size = row[["wave_size"]],
    total_budget = 700,
    optimizer = "adam",
    enforce_target = TRUE
  )
  dplyr::mutate(res$summary,
    method = row[["method"]],
    pi_mean = row[["pi_mean"]],
    wave_sz = row[["wave_size"]]
  )
}

summaries <- do.call(dplyr::bind_rows, lapply(seq_len(nrow(param_grid)), function(i) run_one(param_grid[i, , drop = FALSE])))
#> 
#> --- Wave 1 ---
#> Respondents collected: 0/700
#> 
#> --- Wave 2 ---
#> Respondents collected: 79/700
#> 
#> --- Wave 3 ---
#> Respondents collected: 131/700
#> 
#> --- Wave 4 ---
#> Respondents collected: 182/700
#> 
#> --- Wave 5 ---
#> Respondents collected: 232/700
#> 
#> --- Wave 6 ---
#> Respondents collected: 267/700
#> 
#> --- Wave 7 ---
#> Respondents collected: 293/700
#> 
#> --- Wave 8 ---
#> Respondents collected: 320/700
#> 
#> --- Wave 9 ---
#> Respondents collected: 354/700
#> 
#> --- Wave 10 ---
#> Respondents collected: 375/700
#> 
#> --- Wave 11 ---
#> Respondents collected: 394/700
#> 
#> --- Wave 12 ---
#> Respondents collected: 410/700
#> 
#> --- Wave 13 ---
#> Respondents collected: 427/700
#> 
#> --- Wave 14 ---
#> Respondents collected: 452/700
#> 
#> --- Wave 15 ---
#> Respondents collected: 471/700
#> 
#> --- Wave 16 ---
#> Respondents collected: 487/700
#> 
#> --- Wave 17 ---
#> Respondents collected: 498/700
#> 
#> --- Wave 18 ---
#> Respondents collected: 515/700
#> 
#> --- Wave 19 ---
#> Respondents collected: 530/700
#> 
#> --- Wave 20 ---
#> Respondents collected: 546/700
#> Termination reason: Reached maximum waves
#> 
#> --- Wave 1 ---
#> Respondents collected: 0/700
#> 
#> --- Wave 2 ---
#> Respondents collected: 82/700
#> 
#> --- Wave 3 ---
#> Respondents collected: 153/700
#> 
#> --- Wave 4 ---
#> Respondents collected: 217/700
#> 
#> --- Wave 5 ---
#> Respondents collected: 281/700
#> 
#> --- Wave 6 ---
#> Respondents collected: 324/700
#> 
#> --- Wave 7 ---
#> Respondents collected: 346/700
#> 
#> --- Wave 8 ---
#> Respondents collected: 367/700
#> 
#> --- Wave 9 ---
#> Respondents collected: 388/700
#> 
#> --- Wave 10 ---
#> Respondents collected: 405/700
#> 
#> --- Wave 11 ---
#> Respondents collected: 422/700
#> 
#> --- Wave 12 ---
#> Respondents collected: 445/700
#> 
#> --- Wave 13 ---
#> Respondents collected: 462/700
#> 
#> --- Wave 14 ---
#> Respondents collected: 481/700
#> 
#> --- Wave 15 ---
#> Respondents collected: 497/700
#> 
#> --- Wave 16 ---
#> Respondents collected: 511/700
#> 
#> --- Wave 17 ---
#> Respondents collected: 524/700
#> 
#> --- Wave 18 ---
#> Respondents collected: 534/700
#> 
#> --- Wave 19 ---
#> Respondents collected: 550/700
#> 
#> --- Wave 20 ---
#> Respondents collected: 569/700
#> Termination reason: Reached maximum waves
#> 
#> --- Wave 1 ---
#> Respondents collected: 0/700
#> 
#> --- Wave 2 ---
#> Respondents collected: 145/700
#> 
#> --- Wave 3 ---
#> Respondents collected: 229/700
#> 
#> --- Wave 4 ---
#> Respondents collected: 301/700
#> 
#> --- Wave 5 ---
#> Respondents collected: 360/700
#> 
#> --- Wave 6 ---
#> Respondents collected: 388/700
#> 
#> --- Wave 7 ---
#> Respondents collected: 423/700
#> 
#> --- Wave 8 ---
#> Respondents collected: 463/700
#> 
#> --- Wave 9 ---
#> Respondents collected: 496/700
#> 
#> --- Wave 10 ---
#> Respondents collected: 526/700
#> 
#> --- Wave 11 ---
#> Respondents collected: 550/700
#> 
#> --- Wave 12 ---
#> Respondents collected: 574/700
#> 
#> --- Wave 13 ---
#> Respondents collected: 595/700
#> 
#> --- Wave 14 ---
#> Respondents collected: 619/700
#> 
#> --- Wave 15 ---
#> Respondents collected: 638/700
#> 
#> --- Wave 16 ---
#> Respondents collected: 661/700
#> 
#> --- Wave 17 ---
#> Respondents collected: 676/700
#> 
#> --- Wave 18 ---
#> Respondents collected: 693/700
#> Termination reason: Expended budget
#> 
#> --- Wave 1 ---
#> Respondents collected: 0/700
#> 
#> --- Wave 2 ---
#> Respondents collected: 149/700
#> 
#> --- Wave 3 ---
#> Respondents collected: 260/700
#> 
#> --- Wave 4 ---
#> Respondents collected: 360/700
#> 
#> --- Wave 5 ---
#> Respondents collected: 422/700
#> 
#> --- Wave 6 ---
#> Respondents collected: 468/700
#> 
#> --- Wave 7 ---
#> Respondents collected: 495/700
#> 
#> --- Wave 8 ---
#> Respondents collected: 524/700
#> 
#> --- Wave 9 ---
#> Respondents collected: 548/700
#> 
#> --- Wave 10 ---
#> Respondents collected: 576/700
#> 
#> --- Wave 11 ---
#> Respondents collected: 595/700
#> 
#> --- Wave 12 ---
#> Respondents collected: 608/700
#> 
#> --- Wave 13 ---
#> Respondents collected: 633/700
#> 
#> --- Wave 14 ---
#> Respondents collected: 653/700
#> 
#> --- Wave 15 ---
#> Respondents collected: 672/700
#> 
#> --- Wave 16 ---
#> Respondents collected: 686/700
#> Termination reason: Expended budget
#> 
#> --- Wave 1 ---
#> Respondents collected: 0/700
#> 
#> --- Wave 2 ---
#> Respondents collected: 76/700
#> 
#> --- Wave 3 ---
#> Respondents collected: 152/700
#> 
#> --- Wave 4 ---
#> Respondents collected: 225/700
#> 
#> --- Wave 5 ---
#> Respondents collected: 273/700
#> 
#> --- Wave 6 ---
#> Respondents collected: 307/700
#> 
#> --- Wave 7 ---
#> Respondents collected: 344/700
#> 
#> --- Wave 8 ---
#> Respondents collected: 383/700
#> 
#> --- Wave 9 ---
#> Respondents collected: 411/700
#> 
#> --- Wave 10 ---
#> Respondents collected: 432/700
#> 
#> --- Wave 11 ---
#> Respondents collected: 457/700
#> 
#> --- Wave 12 ---
#> Respondents collected: 469/700
#> 
#> --- Wave 13 ---
#> Respondents collected: 482/700
#> 
#> --- Wave 14 ---
#> Respondents collected: 502/700
#> 
#> --- Wave 15 ---
#> Respondents collected: 524/700
#> 
#> --- Wave 16 ---
#> Respondents collected: 539/700
#> 
#> --- Wave 17 ---
#> Respondents collected: 559/700
#> 
#> --- Wave 18 ---
#> Respondents collected: 577/700
#> 
#> --- Wave 19 ---
#> Respondents collected: 588/700
#> 
#> --- Wave 20 ---
#> Respondents collected: 604/700
#> Termination reason: Reached maximum waves
#> 
#> --- Wave 1 ---
#> Respondents collected: 0/700
#> 
#> --- Wave 2 ---
#> Respondents collected: 79/700
#> 
#> --- Wave 3 ---
#> Respondents collected: 158/700
#> 
#> --- Wave 4 ---
#> Respondents collected: 214/700
#> 
#> --- Wave 5 ---
#> Respondents collected: 273/700
#> 
#> --- Wave 6 ---
#> Respondents collected: 311/700
#> 
#> --- Wave 7 ---
#> Respondents collected: 357/700
#> 
#> --- Wave 8 ---
#> Respondents collected: 406/700
#> 
#> --- Wave 9 ---
#> Respondents collected: 448/700
#> 
#> --- Wave 10 ---
#> Respondents collected: 479/700
#> 
#> --- Wave 11 ---
#> Respondents collected: 510/700
#> 
#> --- Wave 12 ---
#> Respondents collected: 537/700
#> 
#> --- Wave 13 ---
#> Respondents collected: 558/700
#> 
#> --- Wave 14 ---
#> Respondents collected: 574/700
#> 
#> --- Wave 15 ---
#> Respondents collected: 592/700
#> 
#> --- Wave 16 ---
#> Respondents collected: 607/700
#> 
#> --- Wave 17 ---
#> Respondents collected: 626/700
#> 
#> --- Wave 18 ---
#> Respondents collected: 642/700
#> 
#> --- Wave 19 ---
#> Respondents collected: 651/700
#> 
#> --- Wave 20 ---
#> Respondents collected: 665/700
#> Termination reason: Reached maximum waves
#> 
#> --- Wave 1 ---
#> Respondents collected: 0/700
#> 
#> --- Wave 2 ---
#> Respondents collected: 129/700
#> 
#> --- Wave 3 ---
#> Respondents collected: 243/700
#> 
#> --- Wave 4 ---
#> Respondents collected: 334/700
#> 
#> --- Wave 5 ---
#> Respondents collected: 392/700
#> 
#> --- Wave 6 ---
#> Respondents collected: 447/700
#> 
#> --- Wave 7 ---
#> Respondents collected: 492/700
#> 
#> --- Wave 8 ---
#> Respondents collected: 531/700
#> 
#> --- Wave 9 ---
#> Respondents collected: 565/700
#> 
#> --- Wave 10 ---
#> Respondents collected: 596/700
#> 
#> --- Wave 11 ---
#> Respondents collected: 623/700
#> 
#> --- Wave 12 ---
#> Respondents collected: 642/700
#> 
#> --- Wave 13 ---
#> Respondents collected: 671/700
#> Termination reason: Expended budget
#> 
#> --- Wave 1 ---
#> Respondents collected: 0/700
#> 
#> --- Wave 2 ---
#> Respondents collected: 144/700
#> 
#> --- Wave 3 ---
#> Respondents collected: 254/700
#> 
#> --- Wave 4 ---
#> Respondents collected: 340/700
#> 
#> --- Wave 5 ---
#> Respondents collected: 420/700
#> 
#> --- Wave 6 ---
#> Respondents collected: 476/700
#> 
#> --- Wave 7 ---
#> Respondents collected: 516/700
#> 
#> --- Wave 8 ---
#> Respondents collected: 551/700
#> 
#> --- Wave 9 ---
#> Respondents collected: 580/700
#> 
#> --- Wave 10 ---
#> Respondents collected: 619/700
#> 
#> --- Wave 11 ---
#> Respondents collected: 651/700
#> 
#> --- Wave 12 ---
#> Respondents collected: 686/700
#> Termination reason: Expended budget

Effective sample and deff

ggplot(summaries, aes(x = wave, y = 1/deff, color = method)) +
  geom_line() +
  facet_grid(pi_mean ~ wave_sz, labeller = label_both) +
  labs(y = "1 / deff (proxy for effective n)", color = "Method")

Absolute error over waves

ggplot(summaries, aes(x = wave, y = abs(error), color = method)) +
  geom_line() +
  facet_grid(pi_mean ~ wave_sz, labeller = label_both) +
  labs(y = "|error|", color = "Method")