tests/testthat/test-condition1-condition2.R

context("Helper - Condition parsing for difference estimators")


test_that("Condition arguments behave as expected", {
  n <- 40
  dat <- data.frame(
    y = rnorm(n),
    bl = rep(1:5, each = 8),
    z = 1:4,
    ps = runif(n)
  )

  horvitz_thompson(y ~ z, data = dat, subset = z <= 2, condition_prs = ps)

  # Subsetting and just selecting two conditions
  expect_identical(
    horvitz_thompson(y ~ z, data = dat, subset = z <= 2, condition_prs = ps),
    horvitz_thompson(y ~ z, data = dat, condition1 = 1L, condition2 = 2L, condition_prs = ps)
  )

  expect_identical(
    difference_in_means(y ~ z, data = dat, subset = z <= 2),
    difference_in_means(y ~ z, data = dat, condition1 = 1L, condition2 = 2L)
  )

  expect_identical(
    difference_in_means(y ~ z, data = dat, subset = z <= 2, blocks = bl),
    difference_in_means(y ~ z, data = dat, condition1 = 1L, condition2 = 2L, blocks = bl)
  )

  # Subsetting and just selecting two conditions
  expect_identical(
    tidy(horvitz_thompson(
      y ~ z,
      data = dat,
      condition1 = 3,
      condition2 = 4,
      condition_prs = rep(0.5, nrow(dat))
    ))[c("estimate", "std.error")],
    tidy(horvitz_thompson(
      y ~ z,
      data = dat,
      condition1 = 4,
      condition2 = 3,
      condition_prs = rep(0.5, nrow(dat))
    ))[c("estimate", "std.error")] * c(-1, 1)
  )

  expect_identical(
    tidy(difference_in_means(
      y ~ z,
      data = dat,
      condition1 = 2,
      condition2 = 1
    ))[c("estimate", "std.error")],
    tidy(difference_in_means(
      y ~ z,
      data = dat,
      condition1 = 1,
      condition2 = 2
    ))[c("estimate", "std.error")] * c(-1, 1)
  )

  # Errors if not specifying both
  expect_error(
    horvitz_thompson(
      y ~ z,
      data = dat,
      condition1 = 4,
      condition_prs = ps
    ),
    "condition1"
  )
  expect_error(
    horvitz_thompson(
      y ~ z,
      data = dat,
      condition2 = 4,
      condition_prs = ps
    ),
    "condition1"
  )
  expect_error(
    horvitz_thompson(
      y ~ z,
      data = dat,
      condition_prs = ps
    ),
    "condition1"
  )

  expect_error(
    difference_in_means(
      y ~ z,
      data = dat,
      condition1 = 4
    ),
    "condition1"
  )
  expect_error(
    difference_in_means(
      y ~ z,
      data = dat,
      condition2 = 4
    ),
    "condition1"
  )
  expect_error(
    difference_in_means(
      y ~ z,
      data = dat
    ),
    "condition1"
  )


  # Specifying only one works with binary treatment
  dat$z <- c("Treated", "Control")
  expect_identical(
    difference_in_means(
      y ~ z,
      data = dat,
      condition1 = "Treated"
    ),
    difference_in_means(
      y ~ z,
      data = dat,
      condition1 = "Treated",
      condition2 = "Control"
    )
  )

  expect_identical(
    horvitz_thompson(
      y ~ z,
      data = dat,
      condition1 = "Treated"
    ),
    horvitz_thompson(
      y ~ z,
      data = dat,
      condition1 = "Treated",
      condition2 = "Control"
    )
  )
  expect_identical(
    difference_in_means(
      y ~ z,
      data = dat,
      condition2 = "Treated"
    ),
    difference_in_means(
      y ~ z,
      data = dat,
      condition2 = "Treated",
      condition1 = "Control"
    )
  )

  expect_identical(
    horvitz_thompson(
      y ~ z,
      data = dat,
      condition2 = "Treated"
    ),
    horvitz_thompson(
      y ~ z,
      data = dat,
      condition2 = "Treated",
      condition1 = "Control"
    )
  )

  # Works with factor
  dat$z <- factor(c("T", "C"))
  # Must pass string!
  difference_in_means(y ~ z, condition2 = "T", data = dat)
  # Errors if not found
  expect_error(
    difference_in_means(
      y ~ z,
      condition2 = 1,
      data = dat
    ),
    "`condition1` and `condition2` must be values found in the treatment"
  )

  dat$z <- 1
  expect_error(
    difference_in_means(y ~ z, data = dat),
    "Must have more than one value in treatment unless using Horvitz"
  )
})
DeclareDesign/estimatr documentation built on March 31, 2024, 10:06 p.m.