DoubleMLIIVM: Double machine learning for interactive IV regression models

Description Format Details Super class Active bindings Methods See Also Examples

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.

Usage
DoubleMLIIVM$new(
  data,
  ml_g,
  ml_m,
  ml_r,
  n_folds = 5,
  n_rep = 1,
  score = "LATE",
  subgroups = list(always_takers = TRUE, never_takers = TRUE),
  dml_procedure = "dml2",
  trimming_rule = "truncate",
  trimming_threshold = 1e-12,
  draw_sample_splitting = TRUE,
  apply_cross_fitting = TRUE
)
Arguments
data

(DoubleMLData)
The DoubleMLData object providing the data and specifying the variables of the causal model.

ml_g

(LearnerRegr, character(1))
An object of the class mlr3 regression learner to pass a learner, possibly with specified parameters, for example lrn("regr.cv_glmnet", s = "lambda.min"). Alternatively, a character(1) specifying the name of a mlr3 regression learner that is available in mlr3 or its extension packages mlr3learners or mlr3extralearners, for example "regr.cv_glmnet".
ml_g refers to the nuisance function g_0(Z,X) = E[Y|X,Z].

ml_m

(LearnerClassif, character(1))
An object of the class mlr3 classification learner to pass a learner, possibly with specified parameters, for example lrn("classif.cv_glmnet", s = "lambda.min"). Alternatively, a character(1) specifying the name of a mlr3 classification learner that is available in mlr3 or its extension packages mlr3learners or mlr3extralearners, for example "classif.cv_glmnet".
ml_m refers to the nuisance function m_0(X) = E[Z|X].

ml_r

(LearnerClassif, character(1))
An object of the class mlr3 classification learner to pass a learner, possibly with specified parameters, for example lrn("classif.cv_glmnet", s = "lambda.min"). Alternatively, a character(1) specifying the name of a mlr3 classification learner that is available in mlr3 or its extension packages mlr3learners or mlr3extralearners, for example "classif.cv_glmnet".
ml_r refers to the nuisance function r_0(Z,X) = E[D|X,Z].

n_folds

(integer(1))
Number of folds. Default is 5.

n_rep

(integer(1))
Number of repetitions for the sample splitting. Default is 1.

score

(character(1), function())
A character(1) ("LATE" is the only choice) specifying the score function. If a function() is provided, it must be of the form function(y, z, d, g0_hat, g1_hat, m_hat, r0_hat, r1_hat, smpls) and the returned output must be a named list() with elements psi_a and psi_b. Default is "LATE".

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. Default is list(always_takers = TRUE, never_takers = TRUE).

dml_procedure

(character(1))
A character(1) ("dml1" or "dml2") specifying the double machine learning algorithm. Default is "dml2".

trimming_rule

(character(1))
A character(1) ("truncate" is the only choice) specifying the trimming approach. Default is "truncate".

trimming_threshold

(numeric(1))
The threshold used for timming. Default is 1e-12.

draw_sample_splitting

(logical(1))
Indicates whether the sample splitting should be drawn during initialization of the object. Default is TRUE.

apply_cross_fitting

(logical(1))
Indicates whether cross-fitting should be applied. Default is TRUE.


Method clone()

The objects of this class are cloneable with this method.

Usage
DoubleMLIIVM$clone(deep = FALSE)
Arguments
deep

Whether to make a deep clone.

See Also

Other DoubleML: DoubleMLIRM, DoubleMLPLIV, DoubleMLPLR, DoubleML

Examples

 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)

DoubleML documentation built on Oct. 26, 2021, 5:06 p.m.