Nothing
# Regression test for the "Unsupported bootstrap method: fe" crash when CV
# selects r = 0 under method = "gsynth".
#
# Chain of the original bug (fect <= 2.2.0, diagnosed 2026-04-21):
# 1. fect(method = "gsynth", CV = TRUE, r = c(0, ...), se = TRUE) dispatches
# to fect_nevertreated.
# 2. When CV picks r.cv == 0, fect_nevertreated used to relabel the outgoing
# `method` slot to "fe".
# 3. fect_boot reads out$method and dispatches per-iteration bootstrap. It
# has branches for gsynth / ife / mc / cfe but no "fe" branch, so it
# would stop() with "Unsupported bootstrap method: fe".
#
# The fix preserves method = "gsynth" (or "cfe") regardless of r.cv. The
# fixture below is a pure two-way-FE DGP that deterministically makes CV
# prefer r = 0 over r >= 1, so this test exercises the r.cv == 0 code path.
test_that("gsynth + CV + se survives when r.cv == 0 (regression for dispatcher crash)", {
## Bootstrap regression test: heavy for CRAN's test budget. Runs in
## the standard test environment (devtools::test() / R CMD check
## without --as-cran sandboxing).
skip_on_cran()
set.seed(20260421)
N <- 20
TT <- 15
id <- rep(seq_len(N), each = TT)
time <- rep(seq_len(TT), times = N)
alpha <- rnorm(N)
xi <- rnorm(TT)
D <- as.integer(id <= 5 & time >= 10)
Y <- alpha[id] + xi[time] + 2 * D + rnorm(N * TT, sd = 0.5)
dat <- data.frame(id = id, time = time, Y = Y, D = D)
# Before the fix this call raised:
# "Unsupported bootstrap method: fe"
out <- fect::fect(
Y ~ D,
data = dat,
index = c("id", "time"),
method = "gsynth",
CV = TRUE,
r = c(0, 3),
se = TRUE,
nboots = 5,
parallel = FALSE
)
expect_s3_class(out, "fect")
expect_equal(out$r.cv, 0)
# Method must remain "gsynth" after CV; relabel to "fe" was the bug.
expect_equal(out$method, "gsynth")
expect_true(is.numeric(out$att.avg))
expect_true(!is.null(out$est.avg))
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.