DeclareDesign Community

How to write the ITT estimand when we simulate one-sided non-compliance?

Hi All,

I’ve been using the code in the draft book chapter on Encouragement Designs to teach me about how to represent a simple Encouragement design with one-way non-compliance. I would like to compare the Intent to Treat Effect (ITT) with the Complier Average Causal Effect (CACE). When the exclusion restriction and no-defiers are true, I would have assumed no bias in the estimate of the ITT. I also would have assumed no bias in the estimate of the ITT even when the exclusion restriction was violated.

Yet, below when direct_effect_of_encouragement is non-zero, I see bias that increases in the direct effect of Z on Y. So, I suspect I’m using DeclareDesign wrong. I’m not surprised to see increasing bias in the estimation of the CACE below, but I am surprised to see it in the estimation of the ITT.

Am I representing the estimand wrong? Or the potential outcomes incorrectly? Would love to hear any thoughts or help.

> res %>% select(direct_effect_of_encouragement,'Estimand Label','Estimator Label','Term','Bias','SD Estimate','Mean Estimand')

   direct_effect_of_encouragement Estimand Label Estimator Label Term  Bias SD Estimate Mean Estimand
1                           0.000           CACE            2SLS    D -0.01        0.11          0.50
2                           0.000            ITT             OLS    Z -0.03        0.09          0.43
3                           0.075           CACE            2SLS    D  0.09        0.12          0.50
4                           0.075            ITT             OLS    Z  0.05        0.09          0.43
5                           0.150           CACE            2SLS    D  0.19        0.11          0.50
6                           0.150            ITT             OLS    Z  0.12        0.09          0.42
7                           0.225           CACE            2SLS    D  0.28        0.12          0.50
8                           0.225            ITT             OLS    Z  0.20        0.09          0.43
9                           0.300           CACE            2SLS    D  0.38        0.11          0.50
10                          0.300            ITT             OLS    Z  0.28        0.09          0.42

Here is the hunk of the code from that book chapter for reference with me adding what I think would be the ITT estimand and estimator.

types <- c("Always-Taker", "Never-Taker", "Complier", "Defier")
direct_effect_of_encouragement <- 0.0
proportion_defiers <- 0.0
design <-
  declare_population(
    N = 500,
    type = sample( types, N, replace = TRUE,
      prob = c(0.1, 0.1, 0.8 - proportion_defiers, proportion_defiers)
    ),
    noise = rnorm(N)
  ) +
  declare_potential_outcomes(
    D ~ case_when(
      Z == 0 & type %in% c("Never-Taker", "Complier") ~ 0,
      Z == 1 & type %in% c("Never-Taker", "Defier") ~ 0,
      Z == 0 & type %in% c("Always-Taker", "Defier") ~ 1,
      Z == 1 & type %in% c("Always-Taker", "Complier") ~ 1
    )
  ) +
  declare_potential_outcomes(
    Y ~ 0.5 * (type == "Complier") * D +
      0.25 * (type == "Always-Taker") * D +
      0.75 * (type == "Defier") * D +
      direct_effect_of_encouragement * Z + noise,
    assignment_variables = c("D", "Z")
  ) +
  declare_estimand(CACE = mean((Y_D_1_Z_1 + Y_D_1_Z_0) / 2 -
                                 (Y_D_0_Z_1 + Y_D_0_Z_0) / 2),
                   subset = type == "Complier") +
  declare_estimand(ITT = mean((Y_D_1_Z_1 + Y_D_1_Z_0) / 2 -
                                 (Y_D_0_Z_1 + Y_D_0_Z_0) / 2)) +
  declare_assignment(prob = 0.5) +
  declare_reveal(D, assignment_variable = "Z") +
  declare_reveal(Y, assignment_variables = c("D", "Z")) +
  declare_estimator(Y ~ D | Z, model = iv_robust, estimand = "CACE",label='2SLS') +
  declare_estimator(Y ~ Z, model=lm_robust, estimand = "ITT",label='OLS')

designs <- redesign(
  design,
  proportion_defiers = 0, 
  direct_effect_of_encouragement = seq(0, 0.3, length.out = 5)
)
plan(multiprocess,workers=8)
bookdesigns_diag <- diagnose_design(designs, bootstrap_sims=0,sims = 1000)
plan(sequential)
res <- reshape_diagnosis(bookdesigns_diag)
res %>% select(direct_effect_of_encouragement,'Estimand Label','Estimator Label','Term','Bias','SD Estimate','Mean Estimand')

I’m not familiar with your specific type of design, but ITT is usually mean(Y_Z_1 - Y_Z_0), so you may want to double check the signs on Y_D_1_Z_0 and Y_D_0_Z_1 in your estimand.

A blog post from last year may also be helpful - https://declaredesign.org/blog/2019-02-05-instrumental-variables.html - the trick of adding extra potential outcome steps might make your estimands simpler to write / debug / interpret.