I'm analyzing a survey experiment data with a factorial design with $2 \times 2$, where each factor is randomly assigned with equal probability.

I'd also like to know the heterogeneous effect of the causal interaction effect of two treatment factors. $$ \tau(x) = E[T_1=1, T_2 =1|X_i = x]-E[T_1=1, T_2 = 0|X_i = x] - (E[T_1 = 0, T_2 = 1|X_i = x] -E[T_1 = 0, T_2 = 0|X_i = x]) $$ To do so, I'm using the causal forest proposed by Athey and Wagner (2018) ran through R package grf.

However, so far, It appears to me grf package cannot be run unless the dataset has only one treatment factor. I haven't found a way to examine the heterogeneous effect of a combination of two treatment factors. (i.e., how treatment factor A affects the effect of treatment factor B. )

Is there a way to perform this sort of analysis using grf, or any other software or package?

The closest case I've found is the application of causal forest on difference-in-difference setting: The Effect of Medicaid Expansion on Wait Time in the Emergency Department The authors seek to find the heterogeneous effect of Medicaid expansion in a setting of DID, and they first calculate the outcome differences between pre- and post-expansion periods and then run a causal forest to estimate HTE.

May 16 update

I've followed the advice of @dimitry. However, I came to know what I calculated was--the column pred_diff in the pred_m_z1z2, in the last code-- was indeed $E(T_1) - E(T_2)$. And this is not equivalent to my quantity of interest that captures how $T_1$ influences the impact of $T_2$.

## creating causal forest models for each treatment variable, z1 and z2
X <-model.matrix(~0 + ., data = d3[, c("X1", "X2")])
m_z1<-causal_forest(X = X, 
                    Y = Y, 
                    W = W1_21, 
                    W.hat = 0.5,
                    clusters = d3$ResponseId_n, num.trees = 2000, seed = 0503)
m_z2<-causal_forest(X = X, 
                Y = Y, 
                W = W2_21, 
                W.hat = 0.5,
                clusters = d3$ResponseId_n, num.trees = 2000, seed = 0503)

## creating data matrix needed to calculate predicted effects for combination values of covariates, X1 and X2
n<-crossing(d3$X1, d3$X2)
xtest <- matrix(0, nrow(n), ncol(X))
xtest[,1] <- n[,1] %>% pull()
xtest[,2] <- n[,2] %>% pull()

# and providing predicted treatment effect 
                   newdata = xtest_21_pri_prty,
                   estimate.variance = T) %>%
  as.data.frame() %>% 
  mutate(X1 = xtest[,1],
         X2 = xtest[,2])

                   newdata = xtest_21_pri_prty,
                   estimate.variance = T) %>%
  as.data.frame() %>% 
  mutate(X1 = xtest_21[,1],
         X2 = xtest_21[,2])

# substracting predicted values
pred_m_z1z2 <-pred_m_z1 %>%
  mutate(predictions_z1 = predictions, variance.estimates_z1 = variance.estimates) %>%
  select(-predictions, -X1, -X2, -variance.estimates) %>% #
  cbind(pred_m_z2) %>%
  mutate(pred_diff = predictions_z1 - predictions) #E(Z1) - E(Z2) for combination values of covariates

Update May 18

I came to know there is model-based causal forests, model4you, that has a very similar functioning to the grf package. Paper 1, Paper 2

And the main difference is the one that identifies subgroups having similar model parameters rather than similar treatment effects.

In this package, I can examine heterogeneous treatment effects using the OLS model with coefficient terms for T1, T2 and their interaction.

$ Y = \alpha + \beta_1 \times T_1 + \beta_2 \times T_2 + \beta_3 \times T_1 \times T_2 $

m1 <- lm(dv~Z1*Z2)
pm1 <- pmforest(m1)

However, since the model-based will find subgroups having similar levels of all four terms, $\alpha, \beta_1, \beta_2, \beta_3$, I believe this might not split subgroups based only on the $b3$ coefficient, which is somewhat different from what I've wanted.

I'd like to know am I correct on this. And it would be grateful if you let me know how to split subgroups based on a combination of treatment effects, $\beta_3$.


  • $\begingroup$ You should clearly state what your question is. An explanation or a link pointing to this idea "by Athey and Wager", (which I believe to be a paper?) would help those unacquainted with it. Finally, when referring to a package/library/module, state from which language/software it is, and also put it in the tag (will help your question reach the relevant audience). $\endgroup$ May 5 at 19:05
  • 1
    $\begingroup$ Sorry about that, @LucasFarias . I have made some revisions to my post to make my question clearer. $\endgroup$
    – Jin
    May 6 at 5:28
  • $\begingroup$ Have you considered pairwise CFs? $\endgroup$
    – dimitriy
    May 6 at 5:48
  • $\begingroup$ @dimitriy Thanks for your comment! Could you provide more information? I am not familiar with pairwise CFs... $\endgroup$
    – Jin
    May 6 at 5:57
  • $\begingroup$ Let’s assume (0, 0) is the baseline. Pairwise means using grf on the baseline vs (0,1). This gives you the term in parentheses. Do grf on (1, 1) vs (1,0). This gives you the first effect. Then difference the two estimates. $\endgroup$
    – dimitriy
    May 6 at 22:19


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.