Double machine learning for interactive IV regression models.

## Format

R6::R6Class object inheriting from DoubleML.

## Details

Interactive IV regression (IIVM) models take the form

$$Y = \ell_0(D,X) + \zeta$$,

$$Z = m_0(X) + V$$,

with $$E[\zeta|X,Z]=0$$ and $$E[V|X] = 0$$. $$Y$$ is the outcome variable, $$D \in \{0,1\}$$ is the binary treatment variable and $$Z \in \{0,1\}$$ is a binary instrumental variable. Consider the functions $$g_0$$, $$r_0$$ and $$m_0$$, where $$g_0$$ maps the support of $$(Z,X)$$ to $$R$$ and $$r_0$$ and $$m_0$$, respectively, map the support of $$(Z,X)$$ and $$X$$ to $$(\epsilon, 1-\epsilon)$$ for some $$\epsilon \in (1, 1/2)$$, such that

$$Y = g_0(Z,X) + \nu,$$

$$D = r_0(Z,X) + U,$$

$$Z = m_0(X) + V,$$

with $$E[\nu|Z,X]=0$$, $$E[U|Z,X]=0$$ and $$E[V|X]=0$$. The target parameter of interest in this model is the local average treatment effect (LATE),

$$\theta_0 = \frac{E[g_0(1,X)] - E[g_0(0,X)]}{E[r_0(1,X)] - E[r_0(0,X)]}.$$

Other DoubleML: DoubleMLIRM, DoubleMLPLIV, DoubleMLPLR, DoubleML

## Super class

DoubleML::DoubleML -> DoubleMLIIVM

## Active bindings

subgroups

(named list(2))
Named list(2) with options to adapt to cases with and without the subgroups of always-takers and never-takes. The entry always_takers(logical(1)) speficies whether there are always takers in the sample. The entry never_takers (logical(1)) speficies whether there are never takers in the sample.

trimming_rule

(character(1))
A character(1) specifying the trimming approach.

trimming_threshold

(numeric(1))
The threshold used for timming.

## Methods

### Public methods

Inherited methods

### Method new()

Creates a new instance of this R6 class.

#### Arguments

deep

Whether to make a deep clone.

## Examples

# \donttest{
library(DoubleML)
library(mlr3)
library(mlr3learners)
library(data.table)
set.seed(2)
ml_g = lrn("regr.ranger",
num.trees = 100, mtry = 20,
min.node.size = 2, max.depth = 5)
ml_m = lrn("classif.ranger",
num.trees = 100, mtry = 20,
min.node.size = 2, max.depth = 5)
ml_r = ml_m$clone() obj_dml_data = make_iivm_data( theta = 0.5, n_obs = 1000, alpha_x = 1, dim_x = 20) dml_iivm_obj = DoubleMLIIVM$new(obj_dml_data, ml_g, ml_m, ml_r)
dml_iivm_obj$fit() dml_iivm_obj$summary()
#> [1] "Estimates and significance testing of the effect of target variables"
#>   Estimate. Std. Error t value Pr(>|t|)
#> d    0.5418     0.2149   2.522   0.0117 *
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#>
#> # }

if (FALSE) {
library(DoubleML)
library(mlr3)
library(mlr3learners)
library(mlr3tuning)
library(data.table)
set.seed(2)
ml_g = lrn("regr.rpart")
ml_m = lrn("classif.rpart")
ml_r = ml_m$clone() obj_dml_data = make_iivm_data( theta = 0.5, n_obs = 1000, alpha_x = 1, dim_x = 20) dml_iivm_obj = DoubleMLIIVM$new(obj_dml_data, ml_g, ml_m, ml_r)
param_grid = list(
"ml_g" = paradox::ParamSet$new(list( paradox::ParamDbl$new("cp", lower = 0.01, upper = 0.02),
paradox::ParamInt$new("minsplit", lower = 1, upper = 2))), "ml_m" = paradox::ParamSet$new(list(
paradox::ParamDbl$new("cp", lower = 0.01, upper = 0.02), paradox::ParamInt$new("minsplit", lower = 1, upper = 2))),
"ml_r" = paradox::ParamSet$new(list( paradox::ParamDbl$new("cp", lower = 0.01, upper = 0.02),
paradox::ParamInt$new("minsplit", lower = 1, upper = 2)))) # minimum requirements for tune_settings tune_settings = list( terminator = mlr3tuning::trm("evals", n_evals = 5), algorithm = mlr3tuning::tnr("grid_search", resolution = 5)) dml_iivm_obj$tune(param_set = param_grid, tune_settings = tune_settings)
dml_iivm_obj$fit() dml_iivm_obj$summary()
}