tests/testthat/test-formula-z.R

# Test | formula interface for inefficiency determinants

test_that("formula with | works for hnormal", {
  sim <- simulate_metafrontier(n_groups = 2, n_per_group = 80, seed = 50)
  # Add a Z variable correlated with inefficiency
  sim$data$z1 <- sim$data$true_u + rnorm(nrow(sim$data), 0, 0.1)

  fit <- metafrontier(log_y ~ log_x1 + log_x2 | z1,
                      data = sim$data, group = "group",
                      method = "sfa", dist = "hnormal")

  expect_s3_class(fit, "metafrontier")
  expect_length(fit$te_group, nrow(sim$data))
  expect_true(all(fit$te_group > 0 & fit$te_group <= 1))

  # Check delta coefficients are stored in group models
  for (g in fit$groups) {
    gm <- fit$group_models[[g]]
    expect_true(!is.null(gm$delta))
    expect_true(!is.null(gm$Z))
  }
})


test_that("formula with | works for tnormal", {
  sim <- simulate_metafrontier(n_groups = 2, n_per_group = 80, seed = 51)
  sim$data$z1 <- sim$data$true_u + rnorm(nrow(sim$data), 0, 0.1)

  fit <- metafrontier(log_y ~ log_x1 + log_x2 | z1,
                      data = sim$data, group = "group",
                      method = "sfa", dist = "tnormal")

  expect_s3_class(fit, "metafrontier")
  expect_length(fit$te_group, nrow(sim$data))
})


test_that("formula with | works for exponential", {
  sim <- simulate_metafrontier(n_groups = 2, n_per_group = 80, seed = 52)
  sim$data$z1 <- sim$data$true_u + rnorm(nrow(sim$data), 0, 0.1)

  fit <- metafrontier(log_y ~ log_x1 + log_x2 | z1,
                      data = sim$data, group = "group",
                      method = "sfa", dist = "exponential")

  expect_s3_class(fit, "metafrontier")
  expect_length(fit$te_group, nrow(sim$data))
})


test_that("formula without | still works (backward compatibility)", {
  sim <- simulate_metafrontier(n_groups = 2, n_per_group = 60, seed = 53)

  fit <- metafrontier(log_y ~ log_x1 + log_x2,
                      data = sim$data, group = "group",
                      method = "sfa")

  expect_s3_class(fit, "metafrontier")
  for (g in fit$groups) {
    expect_null(fit$group_models[[g]]$delta)
    expect_null(fit$group_models[[g]]$Z)
  }
})


test_that("multiple Z variables work", {
  sim <- simulate_metafrontier(n_groups = 2, n_per_group = 80, seed = 54)
  sim$data$z1 <- rnorm(nrow(sim$data))
  sim$data$z2 <- rnorm(nrow(sim$data))

  fit <- metafrontier(log_y ~ log_x1 + log_x2 | z1 + z2,
                      data = sim$data, group = "group",
                      method = "sfa")

  expect_s3_class(fit, "metafrontier")
  # Z should have 3 columns (intercept + z1 + z2)
  for (g in fit$groups) {
    expect_equal(ncol(fit$group_models[[g]]$Z), 3L)
    expect_length(fit$group_models[[g]]$delta, 3L)
  }
})

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.