I have a multiple treatment Double ML use case. Specifically, I have approximately 150M users, 200 treatments and 30 non-treatment covariates. I am very wary, given the EconML notes, that the Lasso regularization in SparseLinearDML will artificially reduce most treatment effects down to zero.
The child class SparseLinearDML, uses an -regularized final model. In particular, it uses an implementation of the DebiasedLasso algorithm [Buhlmann2011] (see DebiasedLasso). Using the asymptotic normality properties of the debiased lasso, this class also offers asymptotically normal based confidence intervals. The theoretical foundations of this class essentially follow the arguments in [Chernozhukov2017], [Chernozhukov2018] [...] If you have too many treatments, then you can use the SparseLinearDML. However, this method will essentially impose a regularization that only a small subset of your featurized treatments has any effect.
So, instead, I intend to train 200 independent DoubleML routines where each estimates the effect of each treatment. The risk of omitted variable bias of the 199 omitted treatment indicators is a chief concern for me. So I plan to condition on these cross-treatment exposure indicators same as any other covariate. However, these cross-treatment exposure indicators are generally sparse and my covariates, originally 30 dimensions, will balloon up to 229 mostly sparse dimensions. So, my intended mitigation here is to reduce the dimensionality of the cross-treatment exposure indicators (not the 30 baseline covariates) to accommodate the sparsity.
Using pseudo code:
for treatment in treatments:
crossTreatmentMatrix = crossTreatmentMatrix.drop(treatment)
distilledCTM = PCA.fit(crossTreatmentMatrix)
X = concatenate(covariates, distilledCTM)
DML.fit(outcomes, exposures, X)
Now, I am fairly certain that this design will mitigate any bias in main effects due to cross-treatment exposures; however, fitting one massive PCA routine every loop is expensive. I am wondering if I can fit a PCA routine once then in the modeling loop, impute the treatment, itself, as zero exposures in the crossTreatmentMatrix, and finally transform this smaller matrix via the already fit PCA model, without introducing any data leakage.
The updated pseudo code would be as follows:
globalPCA = PCA.fit(crossTreatmentMatrix)
for treatment in treatments:
treatmentIndex = crossTreatmentMatrix.index(treatment)
crossTreatmentMatrix[treatmentIndex] = 0.0
transformedCTM = globalPCA.transform(crossTreatmentMatrix)
X = concatenate(covariates, transformedCTM)
DML.fit(outcomes, exposures, X)
My questions are:
- Should the latter design meaningfully increase computational speed?
- Does the latter design prevent any data leakage?
- In premise, is the dimensionality reduction on cross-treatment exposures as a covariate as principled approach?