tests/testthat/test-ComputeShifts.R

test_that("correctly recognizes wrong variable types", {
    df_test <- read.csv("./input/df_test.csv")

    # Character variables
    expect_error(ComputeShifts(df_test, 1,        "periods", "values",  3, F, T))
    expect_error(ComputeShifts(df_test, "country", 1,        "values",  3, F, T))
    expect_error(ComputeShifts(df_test, "country", "periods", 1,        3, F, T))
    expect_error(ComputeShifts(df_test, "country", "periods", "policy", 3, F, T))

    # Logical variables
    expect_error(ComputeShifts(df_test, "country", "periods", "values", 3, "T", F))
    expect_error(ComputeShifts(df_test, "country", "periods", "values", 3, T, "T"))

    # Numeric variables
    expect_error(ComputeShifts(df_test, "country", "periods", "values", "2", F, T))
})

test_that("correctly recognizes variables missing from dataset", {
    df_test <- read.csv("./input/df_test.csv")

    # Character variables
    expect_error(ComputeShifts(df_test, "country", "periods", "policy", 3, F, T))
    expect_error(ComputeShifts(df_test, "state",  "periods", "values", 3, F, T))
})

test_that("correctly adds the desired column(s) of shifts", {
    df_test <- read.csv("./input/df_test.csv")
    cols_original <- colnames(df_test)

    # Add 1 lead/lag
    dt_test <- data.table::as.data.table(df_test)
    cols_new <- colnames(ComputeShifts(dt_test, idvar = "country", timevar = "periods",
                                    shiftvar = "values",
                                    shiftvalues = 2))
    expect_equal(cols_new, c(cols_original, "values_lag2"))

    dt_test <- data.table::as.data.table(df_test)
    cols_new <- colnames(ComputeShifts(dt_test, idvar = "country", timevar = "periods",
                                    shiftvar = "values",
                                    shiftvalues = -2))
    expect_equal(cols_new, c(cols_original, "values_lead2"))

    # Add multiple leads/lags
    dt_test <- data.table::as.data.table(df_test)
    cols_new <- colnames(ComputeShifts(dt_test, idvar = "country", timevar = "periods",
                                    shiftvar = "values",
                                    shiftvalues = 1:2))
    expect_equal(cols_new, c(cols_original, "values_lag1", "values_lag2"))

    dt_test <- data.table::as.data.table(df_test)
    cols_new <- colnames(ComputeShifts(dt_test, idvar = "country", timevar = "periods",
                                    shiftvar = "values",
                                    shiftvalues = -2:-1))
    expect_equal(cols_new, c(cols_original, "values_lead2", "values_lead1"))
})

test_that("the columns added have correct suffixes", {
    df_test <- data.table::fread("./input/df_test.csv")

    df_lags <- ComputeShifts(df_test, idvar = "country", timevar = "periods",
                             shiftvar = "values",
                             shiftvalues = 1:2)

    v_newvars <- setdiff(colnames(df_lags), colnames(df_test))

    expect_true(all(grepl("_lag", v_newvars)))

    df_leads <- ComputeShifts(df_test, idvar = "country", timevar = "periods",
                              shiftvar = "values",
                              shiftvalues = -2:-1)

    v_newvars <- setdiff(colnames(df_leads), colnames(df_test))

    expect_true(all(grepl("_lead", v_newvars)))
})

test_that("correctly shifts variable when there are no holes in timevar", {
    df <- data.table::data.table(
        id      = c(rep("A", 4), rep("B", 2), rep("C", 3)),
        time    = c(1, 2, 3, 4, 1, 2, 1, 2, 3),
        z       = c(10, 12, 13, 14, 8, 9, 10, 11, 12),
        z_lag1  = c(NA, 10, 12, 13, NA, 8, NA, 10, 11),
        z_lead1 = c(12, 13, 14, NA, 9, NA, 11, 12, NA)
    )

    df_shifts <- ComputeShifts(df[, c("id", "time", "z")],
                               idvar = "id", timevar = "time",
                               shiftvar = "z",
                               shiftvalues = c(-1, 1),
                               timevar_holes = FALSE)

    expect_equal(df$z_lead1, df_shifts$z_lead1)
    expect_equal(df$z_lag1,  df_shifts$z_lag1)

    expect_true(all(c("id", "time", "z") %in% colnames(df_shifts)))
})

test_that("correctly shifts variable when there are holes in timevar", {
    df <- data.table::data.table(
        id      = c(rep("A", 4), rep("B", 2), rep("C", 3)),
        time    = c(1, 2, 4, 5, 2, 3, 2, 3, 4),
        z       = c(10, 12, 13, 14, 8, 9, 10, 11, 12),
        z_lag1  = c(NA, 10, NA, 13, NA, 8, NA, 10, 11),
        z_lead1 = c(12, NA, 14, NA, 9, NA, 11, 12, NA)
    )

    df_shifts <- ComputeShifts(df[, c("id", "time", "z")],
                               idvar = "id", timevar = "time",
                               shiftvar = "z",
                               shiftvalues = c(-1, 1),
                               timevar_holes = TRUE)

    expect_equal(df$z_lead1, df_shifts$z_lead1)
    expect_equal(df$z_lag1,  df_shifts$z_lag1)

    expect_true(all(c("id", "time", "z") %in% colnames(df_shifts)))
})

Try the eventstudyr package in your browser

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

eventstudyr documentation built on April 5, 2026, 5:06 p.m.