# DoubleMLIIVM: Double machine learning for interactive IV regression models In DoubleML: Double Machine Learning in R

## Description

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) + ζ,

Z = m_0(X) + V,

with E[ζ|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 (ε, 1-ε) for some ε \in (1, 1/2), such that

Y = g_0(Z,X) + ν,

D = r_0(Z,X) + U,

Z = m_0(X) + V,

with E[ν|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),

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

## 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.

Other DoubleML: DoubleMLIRM, DoubleMLPLIV, DoubleMLPLR, DoubleML
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 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() ## Not run: 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() ## End(Not run)