Double machine learning for partially linear IV regression models.

## Format

R6::R6Class object inheriting from DoubleML.

## Details

Partially linear IV regression (PLIV) models take the form

$$Y - D\theta_0 = g_0(X) + \zeta$$,

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

with $$E[\zeta|Z,X]=0$$ and $$E[V|X] = 0$$. $$Y$$ is the outcome variable variable, $$D$$ is the policy variable of interest and $$Z$$ denotes one or multiple instrumental variables. The high-dimensional vector $$X = (X_1, \ldots, X_p)$$ consists of other confounding covariates, and $$\zeta$$ and $$V$$ are stochastic errors.

Other DoubleML: DoubleMLIIVM, DoubleMLIRM, DoubleMLPLR, DoubleML

## Super class

DoubleML::DoubleML -> DoubleMLPLIV

## Active bindings

partialX

(logical(1))
Indicates whether covariates $$X$$ should be partialled out.

partialZ

(logical(1))
Indicates whether instruments $$Z$$ should be partialled out.

## Methods

### Public methods

Inherited methods

### Method new()

Creates a new instance of this R6 class.

DoubleMLPLIV$new( data, ml_l, ml_m, ml_r, ml_g = NULL, partialX = TRUE, partialZ = FALSE, n_folds = 5, n_rep = 1, score = "partialling out", dml_procedure = "dml2", 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_l (LearnerRegr, Learner, character(1)) A learner of the class LearnerRegr, which is available from mlr3 or its extension packages mlr3learners or mlr3extralearners. Alternatively, a Learner object with public field task_type = "regr" can be passed, for example of class GraphLearner. The learner can possibly be passed with specified parameters, for example lrn("regr.cv_glmnet", s = "lambda.min"). ml_l refers to the nuisance function $$l_0(X) = E[Y|X]$$. ml_m (LearnerRegr, Learner, character(1)) A learner of the class LearnerRegr, which is available from mlr3 or its extension packages mlr3learners or mlr3extralearners. Alternatively, a Learner object with public field task_type = "regr" can be passed, for example of class GraphLearner. The learner can possibly be passed with specified parameters, for example lrn("regr.cv_glmnet", s = "lambda.min"). ml_m refers to the nuisance function $$m_0(X) = E[Z|X]$$. ml_r (LearnerRegr, Learner, character(1)) A learner of the class LearnerRegr, which is available from mlr3 or its extension packages mlr3learners or mlr3extralearners. Alternatively, a Learner object with public field task_type = "regr" can be passed, for example of class GraphLearner. The learner can possibly be passed with specified parameters, for example lrn("regr.cv_glmnet", s = "lambda.min"). ml_r refers to the nuisance function $$r_0(X) = E[D|X]$$. ml_g (LearnerRegr, Learner, character(1)) A learner of the class LearnerRegr, which is available from mlr3 or its extension packages mlr3learners or mlr3extralearners. Alternatively, a Learner object with public field task_type = "regr" can be passed, for example of class GraphLearner. The learner can possibly be passed with specified parameters, for example lrn("regr.cv_glmnet", s = "lambda.min"). ml_g refers to the nuisance function $$g_0(X) = E[Y - D\theta_0|X]$$. Note: The learner ml_g is only required for the score 'IV-type'. Optionally, it can be specified and estimated for callable scores. partialX (logical(1)) Indicates whether covariates $$X$$ should be partialled out. Default is TRUE. partialZ (logical(1)) Indicates whether instruments $$Z$$ should be partialled out. Default is FALSE. 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) ("partialling out" or "IV-type") or a function() specifying the score function. If a function() is provided, it must be of the form function(y, z, d, l_hat, m_hat, r_hat, g_hat, smpls) and the returned output must be a named list() with elements psi_a and psi_b. Default is "partialling out". dml_procedure (character(1)) A character(1) ("dml1" or "dml2") specifying the double machine learning algorithm. Default is "dml2". 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 set_ml_nuisance_params() Set hyperparameters for the nuisance models of DoubleML models. Note that in the current implementation, either all parameters have to be set globally or all parameters have to be provided fold-specific. #### Usage DoubleMLPLIV$set_ml_nuisance_params(
learner = NULL,
treat_var = NULL,
params,
set_fold_specific = FALSE
)

#### Arguments

learner

(character(1))
The nuisance model/learner (see method params_names).

treat_var

(character(1))
The treatment varaible (hyperparameters can be set treatment-variable specific).

params

(named list())
A named list() with estimator parameters. Parameters are used for all folds by default. Alternatively, parameters can be passed in a fold-specific way if option fold_specificis TRUE. In this case, the outer list needs to be of length n_rep and the inner list of length n_folds.

set_fold_specific

(logical(1))
Indicates if the parameters passed in params should be passed in fold-specific way. Default is FALSE. If TRUE, the outer list needs to be of length n_rep and the inner list of length n_folds. Note that in the current implementation, either all parameters have to be set globally or all parameters have to be provided fold-specific.

self

### Method tune()

Hyperparameter-tuning for DoubleML models.

The hyperparameter-tuning is performed using the tuning methods provided in the mlr3tuning package. For more information on tuning in mlr3, we refer to the section on parameter tuning in the mlr3 book.

#### Arguments

deep

Whether to make a deep clone.

## Examples

# \donttest{
library(DoubleML)
library(mlr3)
library(mlr3learners)
library(data.table)
set.seed(2)
ml_l = lrn("regr.ranger", num.trees = 100, mtry = 20, min.node.size = 2, max.depth = 5)
ml_m = ml_l$clone() ml_r = ml_l$clone()
obj_dml_data = make_pliv_CHS2015(alpha = 1, n_obs = 500, dim_x = 20, dim_z = 1)
dml_pliv_obj = DoubleMLPLIV$new(obj_dml_data, ml_l, ml_m, ml_r) dml_pliv_obj$fit()
dml_pliv_obj$summary() #> Estimates and significance testing of the effect of target variables #> Estimate. Std. Error t value Pr(>|t|) #> d 0.9722 0.1032 9.418 <2e-16 *** #> --- #> 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_l = lrn("regr.rpart") ml_m = ml_l$clone()
ml_r = ml_l$clone() obj_dml_data = make_pliv_CHS2015( alpha = 1, n_obs = 500, dim_x = 20, dim_z = 1) dml_pliv_obj = DoubleMLPLIV$new(obj_dml_data, ml_l, ml_m, ml_r)
param_grid = list(
"ml_l" = 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_pliv_obj$tune(param_set = param_grid, tune_settings = tune_settings)
dml_pliv_obj$fit() dml_pliv_obj$summary()
}