tests/testthat/test-malmquist-sfa.R

# Tests for SFA-based Malmquist index (P4)

# Create panel data for Malmquist tests
set.seed(42)
malm_panels <- lapply(1:3, function(t) {
  sim <- simulate_metafrontier(
    n_groups = 2, n_per_group = 40,
    tech_gap = c(0, 0.3 + 0.05 * t),
    sigma_u = c(0.2, 0.3),
    seed = 42 + t
  )
  sim$data$time <- t
  sim$data$id <- seq_len(nrow(sim$data))
  sim$data
})
malm_data <- do.call(rbind, malm_panels)

test_that("SFA Malmquist produces valid output", {
  malm <- malmquist_meta(
    log_y ~ log_x1 + log_x2,
    data = malm_data,
    group = "group",
    time = "time",
    method = "sfa"
  )

  expect_s3_class(malm, "malmquist_meta")
  expect_true(nrow(malm$malmquist) > 0)
  expect_true(all(c("MPI", "TEC", "TGC", "TC") %in% names(malm$malmquist)))
})

test_that("SFA Malmquist TEC x TGC x TC* approximates MPI", {
  malm <- malmquist_meta(
    log_y ~ log_x1 + log_x2,
    data = malm_data,
    group = "group",
    time = "time",
    method = "sfa"
  )

  m <- malm$malmquist
  valid <- complete.cases(m[, c("MPI", "TEC", "TGC", "TC")])
  if (sum(valid) > 0) {
    product <- m$TEC[valid] * m$TGC[valid] * m$TC[valid]
    expect_equal(product, m$MPI[valid], tolerance = 0.1)
  }
})

test_that("DEA Malmquist still works with method arg", {
  malm_dea <- malmquist_meta(
    log_y ~ log_x1 + log_x2,
    data = malm_data,
    group = "group",
    time = "time",
    method = "dea"
  )

  expect_s3_class(malm_dea, "malmquist_meta")
  expect_true(nrow(malm_dea$malmquist) > 0)
})

test_that("SFA Malmquist TGR values are positive", {
  malm <- malmquist_meta(
    log_y ~ log_x1 + log_x2,
    data = malm_data,
    group = "group",
    time = "time",
    method = "sfa"
  )

  valid <- malm$tgr$TGR_from[is.finite(malm$tgr$TGR_from)]
  expect_true(all(valid > 0))
})

Try the metafrontier package in your browser

Any scripts or data that you put into this service are public.

metafrontier documentation built on Aug. 19, 2026, 5:08 p.m.