{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "126e2f75", "metadata": {}, "source": [ "# R: Ensemble Learners and More with `mlr3pipelines`" ] }, { "attachments": {}, "cell_type": "markdown", "id": "aa30571a", "metadata": {}, "source": [ "This notebook illustrates how to exploit the powerful tools provided by the [mlr3pipelines](https://mlr3pipelines.mlr-org.com/) package (Binder et al. 2021). For example, [mlr3pipelines](https://mlr3pipelines.mlr-org.com/) can be used in combination with [DoubleML](https://docs.doubleml.org/stable/index.html) for feature engineering, combination of learners (ensemble learners, stacking), subsampling and hyperparameter tuning. The underlying idea of [mlr3pipelines](https://mlr3pipelines.mlr-org.com/) is to define a pipeline that incorporates a user's desired operations. As a result, the pipeline returns an object of class [Learner](https://mlr3.mlr-org.com/reference/Learner.html) which can easily be passed to [DoubleML](https://docs.doubleml.org/stable/index.html). For an introduction to [mlr3pipelines](https://mlr3pipelines.mlr-org.com/), we refer to the [Pipelines Chapter](https://mlr3book.mlr-org.com/pipelines.html) in the [mlr3book](https://mlr3book.mlr-org.com) (Becker et al. 2020) and to the [package website](https://mlr3pipelines.mlr-org.com/).\n", "\n", "\n", "We intend to illustrate the major idea of how to use [mlr3pipelines](https://mlr3pipelines.mlr-org.com/) in combination with [DoubleML](https://docs.doubleml.org/stable/index.html) in very simple examples. We use pipelines that are identical or very similar to the ones in the [Pipelines Chapter](https://mlr3book.mlr-org.com/pipelines.html) in the [mlr3book](https://mlr3book.mlr-org.com). Hence, we do not claim that the proposed learners are optimal in terms of their performance.\n", "\n", "We start with the simple simulated data example and the [Bonus data set](https://docs.doubleml.org/r/stable/reference/fetch_bonus.html) from the [Getting Started Section in the DoubleML user guide](https://docs.doubleml.org/dev/intro/intro.html)." ] }, { "cell_type": "code", "execution_count": 1, "id": "fc314dcf", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "text/plain": [ "================= DoubleMLData Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: y\n", "Treatment variable(s): d\n", "Covariates: X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, X59, X60, X61, X62, X63, X64, X65, X66, X67, X68, X69, X70, X71, X72, X73, X74, X75, X76, X77, X78, X79, X80, X81, X82, X83, X84, X85, X86, X87, X88, X89, X90, X91, X92, X93, X94, X95, X96, X97, X98, X99, X100\n", "Instrument(s): \n", "No. Observations: 500" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "library(DoubleML)\n", "\n", "# Simulate data\n", "set.seed(3141)\n", "n_obs = 500\n", "n_vars = 100\n", "theta = 3\n", "X = matrix(rnorm(n_obs*n_vars), nrow=n_obs, ncol=n_vars)\n", "d = X[,1:3]%*%c(5,5,5) + rnorm(n_obs)\n", "y = theta*d + X[, 1:3]%*%c(5,5,5) + rnorm(n_obs)\n", "\n", "\n", "# Specify the data and variables for the causal model\n", "# matrix interface to DoubleMLData\n", "dml_data_sim = double_ml_data_from_matrix(X=X, y=y, d=d)\n", "dml_data_sim" ] }, { "attachments": {}, "cell_type": "markdown", "id": "5913f88c", "metadata": {}, "source": [ "To have an example with a classification learner, we load the [Bonus data set](https://docs.doubleml.org/r/stable/reference/fetch_bonus.html)." ] }, { "cell_type": "code", "execution_count": 2, "id": "dea5e13a", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.table: 6 × 17
inuidur1femaleblackothracedep1dep2q2q3q4q5q6agelt35agegt54durablelusdhusdtg
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
2.8903720000100010000010
0.0000000000000010000100
3.2958370000000100000100
2.1972250000001000100001
3.2958370001000010011100
3.2958371000000010010100
\n" ], "text/latex": [ "A data.table: 6 × 17\n", "\\begin{tabular}{lllllllllllllllll}\n", " inuidur1 & female & black & othrace & dep1 & dep2 & q2 & q3 & q4 & q5 & q6 & agelt35 & agegt54 & durable & lusd & husd & tg\\\\\n", " & & & & & & & & & & & & & & & & \\\\\n", "\\hline\n", "\t 2.890372 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0\\\\\n", "\t 0.000000 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0\\\\\n", "\t 3.295837 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0\\\\\n", "\t 2.197225 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1\\\\\n", "\t 3.295837 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 1 & 1 & 0 & 0\\\\\n", "\t 3.295837 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 0\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.table: 6 × 17\n", "\n", "| inuidur1 <dbl> | female <dbl> | black <dbl> | othrace <dbl> | dep1 <dbl> | dep2 <dbl> | q2 <dbl> | q3 <dbl> | q4 <dbl> | q5 <dbl> | q6 <dbl> | agelt35 <dbl> | agegt54 <dbl> | durable <dbl> | lusd <dbl> | husd <dbl> | tg <dbl> |\n", "|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n", "| 2.890372 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |\n", "| 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |\n", "| 3.295837 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |\n", "| 2.197225 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |\n", "| 3.295837 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |\n", "| 3.295837 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |\n", "\n" ], "text/plain": [ " inuidur1 female black othrace dep1 dep2 q2 q3 q4 q5 q6 agelt35 agegt54\n", "1 2.890372 0 0 0 0 1 0 0 0 1 0 0 0 \n", "2 0.000000 0 0 0 0 0 0 0 0 1 0 0 0 \n", "3 3.295837 0 0 0 0 0 0 0 1 0 0 0 0 \n", "4 2.197225 0 0 0 0 0 0 1 0 0 0 1 0 \n", "5 3.295837 0 0 0 1 0 0 0 0 1 0 0 1 \n", "6 3.295837 1 0 0 0 0 0 0 0 1 0 0 1 \n", " durable lusd husd tg\n", "1 0 0 1 0 \n", "2 0 1 0 0 \n", "3 0 1 0 0 \n", "4 0 0 0 1 \n", "5 1 1 0 0 \n", "6 0 1 0 0 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "================= DoubleMLData Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: inuidur1\n", "Treatment variable(s): tg\n", "Covariates: female, black, othrace, dep1, dep2, q2, q3, q4, q5, q6, agelt35, agegt54, durable, lusd, husd\n", "Instrument(s): \n", "No. Observations: 5099\n" ] } ], "source": [ "# Load bonus data\n", "df_bonus = fetch_bonus(return_type=\"data.table\")\n", "head(df_bonus)\n", "\n", "# Specify the data and variables for the causal model\n", "x_vars = c(\"female\", \"black\", \"othrace\", \"dep1\", \"dep2\",\n", " \"q2\", \"q3\", \"q4\", \"q5\", \"q6\", \"agelt35\", \"agegt54\",\n", " \"durable\", \"lusd\", \"husd\")\n", "dim_x = length(x_vars)\n", "dml_data_bonus = DoubleMLData$new(df_bonus,\n", " y_col = \"inuidur1\",\n", " d_cols = \"tg\",\n", " x_cols = x_vars)\n", "print(dml_data_bonus)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "1bfd66c6", "metadata": {}, "source": [ "To specify a learner for the nuisance part in a causal model, we can either use [mlr3](https://mlr3.mlr-org.com/)'s [LearnerRegr](https://mlr3.mlr-org.com/reference/LearnerRegr.html) for a model's nuisance part with a continuous dependent variable or a [LearnerClassif](https://mlr3.mlr-org.com/reference/LearnerClassif.html) if the corresponding outcome variable is binary. \n", "\n", "Moreover, it's possible to create a learner based on a pipeline. For example, we could think of [ensemble learners](https://mlr3book.mlr-org.com/pipelines.html#sec-pipelines-intro) which combine several estimators." ] }, { "attachments": {}, "cell_type": "markdown", "id": "5e23aab7", "metadata": {}, "source": [ "## Using learners from `mlr3`, `mlr3learners` and `mlr3extralearners`\n", "\n", "Let's begin with a \"standard\" example on how to use any of the learners provided by [mlr3](https://mlr3.mlr-org.com/) (Lang et al. 2020), [mlr3learners](https://mlr3learners.mlr-org.com/) (Lang et al. 2021) and [mlr3extralearners](https://mlr3extralearners.mlr-org.com/) (Sonabend and Schratz 2021) in [DoubleML](https://docs.doubleml.org/stable/index.html): We create an object of the class [Learner](https://mlr3.mlr-org.com/reference/Learner.html) which [DoubleML](https://docs.doubleml.org/stable/index.html) internally uses for model training and generation of predictions. \n", "\n", "In the simulated example, we will use a lasso estimator for the continuous treatment variable, which is based on the [glmnet package](https://glmnet.stanford.edu/index.html). For the binary treatment variable in the Bonus data example, we use a random forest classifier as provided by [ranger](https://github.com/imbs-hl/ranger)." ] }, { "cell_type": "code", "execution_count": 3, "id": "c0260edd", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message:\n", "\"Paket 'mlr3' wurde unter R Version 4.2.3 erstellt\"\n" ] }, { "data": { "text/html": [ "\n", "
  1. 'LearnerRegrCVGlmnet'
  2. 'LearnerRegr'
  3. 'Learner'
  4. 'R6'
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 'LearnerRegrCVGlmnet'\n", "\\item 'LearnerRegr'\n", "\\item 'Learner'\n", "\\item 'R6'\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 'LearnerRegrCVGlmnet'\n", "2. 'LearnerRegr'\n", "3. 'Learner'\n", "4. 'R6'\n", "\n", "\n" ], "text/plain": [ "[1] \"LearnerRegrCVGlmnet\" \"LearnerRegr\" \"Learner\" \n", "[4] \"R6\" " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "library(mlr3)\n", "library(mlr3learners)\n", "\n", "# suppress messages during fitting\n", "lgr::get_logger(\"mlr3\")$set_threshold(\"warn\")\n", "\n", "learner_lasso = lrn(\"regr.cv_glmnet\", s=\"lambda.min\")\n", "ml_l_lasso = learner_lasso$clone()\n", "ml_m_lasso = learner_lasso$clone()\n", "class(ml_l_lasso)" ] }, { "cell_type": "code", "execution_count": 4, "id": "51ae80df", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "text/html": [ "\n", "
  1. 'LearnerRegrRanger'
  2. 'LearnerRegr'
  3. 'Learner'
  4. 'R6'
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 'LearnerRegrRanger'\n", "\\item 'LearnerRegr'\n", "\\item 'Learner'\n", "\\item 'R6'\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 'LearnerRegrRanger'\n", "2. 'LearnerRegr'\n", "3. 'Learner'\n", "4. 'R6'\n", "\n", "\n" ], "text/plain": [ "[1] \"LearnerRegrRanger\" \"LearnerRegr\" \"Learner\" \n", "[4] \"R6\" " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Random forest learner for nuisance part ml_l\n", "learner_forest_regr = lrn(\"regr.ranger\",\n", " num.trees=500, mtry=floor(sqrt(dim_x)),\n", " max.depth=5, min.node.size=2)\n", "\n", "# Random forest learner for nuisance part ml_m (binary outcome)\n", "learner_forest_classif = lrn(\"classif.ranger\",\n", " num.trees=500,\n", " mtry=floor(sqrt(dim_x)),\n", " max.depth=5, min.node.size=2)\n", "\n", "ml_l_forest = learner_forest_regr$clone()\n", "ml_m_forest = learner_forest_classif$clone()\n", "class(ml_l_forest)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "28795baa", "metadata": {}, "source": [ "We set up a causal model, here we specify a partially linear model and thereby pass the learner as an input. Let's fit the models." ] }, { "cell_type": "code", "execution_count": 5, "id": "2a231d42", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================= DoubleMLPLR Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: y\n", "Treatment variable(s): d\n", "Covariates: X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, X59, X60, X61, X62, X63, X64, X65, X66, X67, X68, X69, X70, X71, X72, X73, X74, X75, X76, X77, X78, X79, X80, X81, X82, X83, X84, X85, X86, X87, X88, X89, X90, X91, X92, X93, X94, X95, X96, X97, X98, X99, X100\n", "Instrument(s): \n", "No. Observations: 500\n", "\n", "------------------ Score & algorithm ------------------\n", "Score function: partialling out\n", "DML algorithm: dml2\n", "\n", "------------------ Machine learner ------------------\n", "ml_l: regr.cv_glmnet\n", "ml_m: regr.cv_glmnet\n", "\n", "------------------ Resampling ------------------\n", "No. folds: 5\n", "No. repeated sample splits: 1\n", "Apply cross-fitting: TRUE\n", "\n", "------------------ Fit summary ------------------\n", " Estimates and significance testing of the effect of target variables\n", " Estimate. Std. Error t value Pr(>|t|) \n", "d 3.01219 0.04415 68.22 <2e-16 ***\n", "---\n", "Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n", "\n", "\n" ] } ], "source": [ "set.seed(123)\n", "obj_dml_plr_sim = DoubleMLPLR$new(dml_data_sim,\n", " ml_l=ml_l_lasso,\n", " ml_m=ml_m_lasso)\n", "obj_dml_plr_sim$fit()\n", "print(obj_dml_plr_sim)" ] }, { "cell_type": "code", "execution_count": 6, "id": "fdd9e0f8", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================= DoubleMLPLR Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: inuidur1\n", "Treatment variable(s): tg\n", "Covariates: female, black, othrace, dep1, dep2, q2, q3, q4, q5, q6, agelt35, agegt54, durable, lusd, husd\n", "Instrument(s): \n", "No. Observations: 5099\n", "\n", "------------------ Score & algorithm ------------------\n", "Score function: partialling out\n", "DML algorithm: dml2\n", "\n", "------------------ Machine learner ------------------\n", "ml_l: regr.ranger\n", "ml_m: classif.ranger\n", "\n", "------------------ Resampling ------------------\n", "No. folds: 5\n", "No. repeated sample splits: 1\n", "Apply cross-fitting: TRUE\n", "\n", "------------------ Fit summary ------------------\n", " Estimates and significance testing of the effect of target variables\n", " Estimate. Std. Error t value Pr(>|t|) \n", "tg -0.0765 0.0354 -2.161 0.0307 *\n", "---\n", "Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n", "\n", "\n" ] } ], "source": [ "set.seed(123)\n", "obj_dml_plr_bonus = DoubleMLPLR$new(dml_data_bonus,\n", " ml_l=ml_l_forest,\n", " ml_m=ml_m_forest)\n", "obj_dml_plr_bonus$fit()\n", "print(obj_dml_plr_bonus)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "4da0184d", "metadata": {}, "source": [ "## Set up learners based on `mlr3pipelines`" ] }, { "attachments": {}, "cell_type": "markdown", "id": "c26bbf84", "metadata": {}, "source": [ "These learners can also be constructed using [mlr3pipelines](https://mlr3pipelines.mlr-org.com/). We'll first use the PipeOp constructor [po()](https://mlr3pipelines.mlr-org.com/reference/po.html) to define the learner construction and then initiate a new instance of the [Learner](https://mlr3.mlr-org.com/reference/Learner.html) class. [po()](https://mlr3pipelines.mlr-org.com/reference/po.html) implements a computational step in a pipeline. For more information, we refer to the [Pipelines Chapter in the mlr3book](https://mlr3book.mlr-org.com/pipelines.html)." ] }, { "cell_type": "code", "execution_count": 7, "id": "4b09ebeb", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "text/html": [ "\n", "
  1. 'GraphLearner'
  2. 'Learner'
  3. 'R6'
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 'GraphLearner'\n", "\\item 'Learner'\n", "\\item 'R6'\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 'GraphLearner'\n", "2. 'Learner'\n", "3. 'R6'\n", "\n", "\n" ], "text/plain": [ "[1] \"GraphLearner\" \"Learner\" \"R6\" " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Lasso learner\n", "library(mlr3pipelines)\n", "pipe_lasso = po(lrn(\"regr.cv_glmnet\"), s = \"lambda.min\")\n", "ml_l_lasso_pipe = as_learner(pipe_lasso)\n", "ml_m_lasso_pipe = as_learner(pipe_lasso)\n", "\n", "# Class of the lasso learner\n", "class(ml_l_lasso_pipe)" ] }, { "cell_type": "code", "execution_count": 8, "id": "52e41460", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "text/html": [ "\n", "
  1. 'GraphLearner'
  2. 'Learner'
  3. 'R6'
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 'GraphLearner'\n", "\\item 'Learner'\n", "\\item 'R6'\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 'GraphLearner'\n", "2. 'Learner'\n", "3. 'R6'\n", "\n", "\n" ], "text/plain": [ "[1] \"GraphLearner\" \"Learner\" \"R6\" " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
  1. 'GraphLearner'
  2. 'Learner'
  3. 'R6'
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 'GraphLearner'\n", "\\item 'Learner'\n", "\\item 'R6'\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 'GraphLearner'\n", "2. 'Learner'\n", "3. 'R6'\n", "\n", "\n" ], "text/plain": [ "[1] \"GraphLearner\" \"Learner\" \"R6\" " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Random forest learner for nuisance part ml_l\n", "pipe_forest_regr = po(lrn(\"regr.ranger\"),\n", " num.trees=500, mtry=floor(sqrt(dim_x)),\n", " max.depth=5, min.node.size=2)\n", "\n", "# Random forest learner for nuisance part ml_m (binary outcome)\n", "pipe_forest_classif = po(lrn(\"classif.ranger\"),\n", " num.trees=500,\n", " mtry=floor(sqrt(dim_x)),\n", " max.depth=5, min.node.size=2)\n", "\n", "ml_l_forest_pipe = as_learner(pipe_forest_regr)\n", "ml_m_forest_pipe = as_learner(pipe_forest_classif)\n", "\n", "# Class of the random forest learners\n", "class(ml_l_forest_pipe)\n", "class(ml_m_forest_pipe)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "14a6bfb6", "metadata": {}, "source": [ "Let's use these learners to fit the PLR in both examples." ] }, { "cell_type": "code", "execution_count": 9, "id": "bcf86234", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================= DoubleMLPLR Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: y\n", "Treatment variable(s): d\n", "Covariates: X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, X59, X60, X61, X62, X63, X64, X65, X66, X67, X68, X69, X70, X71, X72, X73, X74, X75, X76, X77, X78, X79, X80, X81, X82, X83, X84, X85, X86, X87, X88, X89, X90, X91, X92, X93, X94, X95, X96, X97, X98, X99, X100\n", "Instrument(s): \n", "No. Observations: 500\n", "\n", "------------------ Score & algorithm ------------------\n", "Score function: partialling out\n", "DML algorithm: dml2\n", "\n", "------------------ Machine learner ------------------\n", "ml_l: regr.cv_glmnet\n", "ml_m: regr.cv_glmnet\n", "\n", "------------------ Resampling ------------------\n", "No. folds: 5\n", "No. repeated sample splits: 1\n", "Apply cross-fitting: TRUE\n", "\n", "------------------ Fit summary ------------------\n", " Estimates and significance testing of the effect of target variables\n", " Estimate. Std. Error t value Pr(>|t|) \n", "d 3.01219 0.04415 68.22 <2e-16 ***\n", "---\n", "Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n", "\n", "\n" ] } ], "source": [ "set.seed(123)\n", "obj_dml_plr_sim_pipe = DoubleMLPLR$new(dml_data_sim,\n", " ml_l=ml_l_lasso_pipe,\n", " ml_m=ml_m_lasso_pipe)\n", "obj_dml_plr_sim_pipe$fit()\n", "print(obj_dml_plr_sim_pipe)" ] }, { "cell_type": "code", "execution_count": 10, "id": "b9decfad", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================= DoubleMLPLR Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: inuidur1\n", "Treatment variable(s): tg\n", "Covariates: female, black, othrace, dep1, dep2, q2, q3, q4, q5, q6, agelt35, agegt54, durable, lusd, husd\n", "Instrument(s): \n", "No. Observations: 5099\n", "\n", "------------------ Score & algorithm ------------------\n", "Score function: partialling out\n", "DML algorithm: dml2\n", "\n", "------------------ Machine learner ------------------\n", "ml_l: regr.ranger\n", "ml_m: classif.ranger\n", "\n", "------------------ Resampling ------------------\n", "No. folds: 5\n", "No. repeated sample splits: 1\n", "Apply cross-fitting: TRUE\n", "\n", "------------------ Fit summary ------------------\n", " Estimates and significance testing of the effect of target variables\n", " Estimate. Std. Error t value Pr(>|t|) \n", "tg -0.0765 0.0354 -2.161 0.0307 *\n", "---\n", "Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n", "\n", "\n" ] } ], "source": [ "set.seed(123)\n", "obj_dml_plr_bonus_pipe = DoubleMLPLR$new(dml_data_bonus,\n", " ml_l=ml_l_forest_pipe,\n", " ml_m=ml_m_forest_pipe)\n", "obj_dml_plr_bonus_pipe$fit()\n", "print(obj_dml_plr_bonus_pipe)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "952de1c7", "metadata": {}, "source": [ "## Use ensemble learners based on `mlr3pipelines`\n" ] }, { "attachments": {}, "cell_type": "markdown", "id": "e0ad79d6", "metadata": {}, "source": [ "First, let's see how we can use more complicated [GraphLearner](https://mlr3pipelines.mlr-org.com/reference/mlr_learners_graph.html)s like ensemble learners in [DoubleML](https://docs.doubleml.org/). For example, we want to create a learner with predictions that are generated as an average from three different learners. In the first step, we split up the pipeline into three branches. In our example, the learners estimate the nuisance parts independently of each other. In the last step, we average the predictions. Thereby we will use the pipe operator `%>>%`. For more details, we refer to the [Pipelines Chapter in the mlr3book](https://mlr3book.mlr-org.com/pipelines.html)." ] }, { "cell_type": "code", "execution_count": 11, "id": "dd0a7ab6", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "text/html": [ "\n", "
  1. 'Graph'
  2. 'R6'
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 'Graph'\n", "\\item 'R6'\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 'Graph'\n", "2. 'R6'\n", "\n", "\n" ], "text/plain": [ "[1] \"Graph\" \"R6\" " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# For regression (nuisance parts with continuous outcome)\n", "graph_ensemble_regr = gunion(list(\n", " po(\"learner\", lrn(\"regr.cv_glmnet\", s = \"lambda.min\")),\n", " po(\"learner\", lrn(\"regr.ranger\")),\n", " po(\"learner\", lrn(\"regr.rpart\", cp = 0.01))\n", " )) %>>%\n", " po(\"regravg\", 3)\n", "\n", "# Class of ' graph_ensemble_regr'\n", "class(graph_ensemble_regr)" ] }, { "cell_type": "code", "execution_count": 12, "id": "d931817d", "metadata": { "tags": [ "nbsphinx-thumbnail" ], "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAMAAADKOT/pAAAAhFBMVEUAAAAAADgAAEMAAEwAAFQAAFsAAGEAAGwAAHEAAH8AAIMAAIcAAItFMIdNTa5eQYNoaLpwTX98fMN+V3qLYHaMjMqWaHGamtGhb2ynp9epqamqdmeystyzfGG7gVu9veHDh1THx+XLjEzQ0OnSkUPZljjZ2e3h4fHmnwDp6fXw8Pj////00K1MAAAACXBIWXMAABJ0AAASdAHeZh94AAAgAElEQVR4nO3diXYaubaAYbrvdM5pYYznOR7ALqj3f79bE6MLKGCXtLf0f2t12knsRCXpl2zH3RnkAM42CD0AIAaEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQrBoUQo8BS6yFQWVDg6wwoCYtWAZz6oZWSEkDFsGYbCujKqXQgwIhGbN9HXEpKcEKWNJ2HXEpqcACGLK7I0oKjfk3ZE9HlBQY02/H3o4oKSxm34wDHVFSUEy+GYSkGZNvxcGOKCkk5t6IDh1lrGY4TL0RXULiSgqHqdfNNS7+rkpxK6O76eL7Gz9eCz3u5BCScnPn5vn80f2nvnMmblJ+U7QzHQ/rFyeLH3c3g7K84o3uCck3QlJs/nHVlFF8O65LcvXFVHzz7m4WL9Y/7qaLkObu6mMeePCJISS1vu4vX+bLkK7d3VZI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plVIt80v1IQ057N2XhCSOs2fI9V//HNRdfHovqqQXveEdFd8uFSu5kfzyzQh8edIfhCSUleX5Vc2XFZ/HpvPLy7+K8veb6Z1M9VXMZSmixfKl4fDn0H+fd90U341RMDhJ4eQtPpTfq3d4p2y2f0/bng3XfsMg1t/oc7r5sJdPDYd8YV2nhGSFYe//JvFDIi5N4P/1FwzJt+MQyGxliEx+XbsL4mlDIrZN4T/QaReTL8h+0JiJcNi+i1p/7soqoxYyLCYf1vaS2IZg2MFjGm5lLiOFGAJzNlKiYxUYBEMWvxlzDl/GbMaLINVNKQKawEIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAABX37WcAAAG2SURBVCEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAwP8D9JriSO+qgk8AAAAASUVORK5CYII=", "text/plain": [ "Plot with title \"\"" ] }, "metadata": { "image/png": { "height": 420, "width": 420 } }, "output_type": "display_data" } ], "source": [ "# Plot the graph\n", "graph_ensemble_regr$plot()" ] }, { "cell_type": "code", "execution_count": 13, "id": "94f8e41b", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "text/html": [ "\n", "
  1. 'Graph'
  2. 'R6'
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 'Graph'\n", "\\item 'R6'\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 'Graph'\n", "2. 'R6'\n", "\n", "\n" ], "text/plain": [ "[1] \"Graph\" \"R6\" " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# For classification (nuisance part ml_m in the Bonus example)\n", "graph_ensemble_classif = gunion(list(\n", " po(\"learner\", lrn(\"classif.cv_glmnet\", s = \"lambda.min\")),\n", " po(\"learner\", lrn(\"classif.ranger\")),\n", " po(\"learner\", lrn(\"classif.rpart\", cp = 0.01))\n", " )) %>>%\n", " po(\"classifavg\", 3)\n", "\n", "# Class of 'graph_ensemble_classif'\n", "class(graph_ensemble_classif)" ] }, { "cell_type": "code", "execution_count": 14, "id": "34c3e25a", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAMAAADKOT/pAAAAh1BMVEUAAAAAADgAAEMAAEwAAFQAAFsAAGEAAGwAAHYAAHoAAH8AAIMAAIcAAItFMIdNTa5eQYNoaLpwTX98fMN+V3qLYHaMjMqWaHGamtGhb2ynp9epqamqdmeystyzfGG7gVu9veHDh1THx+XLjEzQ0OnSkUPZljjZ2e3h4fHmnwDp6fXw8Pj///+/n7M+AAAACXBIWXMAABJ0AAASdAHeZh94AAAgAElEQVR4nO3di3bbNraAYU8702lPB5IlxZfIteObZFPi+z/f4UXUXSQlbQJ7g/+3VmO5iR0QwE9YtpPcpACudhN6AEAMCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIQECCAkQQEiAAEICBBASIICQAAGEBAggJEAAIVl1kwk9BqyxFgblDd0kmRtq0oJlMKdsaIOUNGARjEn2MipSCj0oEJIx+8cRh5ISrIAlx44jDiUVWABDTndESaEx/4bUdERJgTH9dtR2RElhMftmNHRESUEx+WYQkmZMvhWNHVFSSMy9ES06SljNcJh6I9qExJEUDlOvm1sZ/laU4jZuH+bV6zv/vxR63L1DSMotnVumy6n7uzxzZm6W/5C1Mx8Pyoez6v+7u5u8vOyNHgnJN0JSbPk+WZWR/TguS3LlwZT98Obuqofl/3fzKqSlm7wvAw++ZwhJrc/H0fNy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", "text/plain": [ "Plot with title \"\"" ] }, "metadata": { "image/png": { "height": 420, "width": 420 } }, "output_type": "display_data" } ], "source": [ "# Plot the graph\n", "graph_ensemble_classif$plot()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ac7308a1", "metadata": {}, "source": [ "We create a new instance of a [GraphLearner](https://mlr3pipelines.mlr-org.com/reference/mlr_learners_graph.html) which is later used in [DoubleML](https://docs.doubleml.org)." ] }, { "cell_type": "code", "execution_count": 15, "id": "e15ae052", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "ensemble_pipe_regr = as_learner(graph_ensemble_regr)\n", "ensemble_pipe_classif = as_learner(graph_ensemble_classif)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "32724fc8", "metadata": {}, "source": [ "Let's estimate the two PLR examples with the ensemble learner." ] }, { "cell_type": "code", "execution_count": 16, "id": "4cfdd413", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================= DoubleMLPLR Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: y\n", "Treatment variable(s): d\n", "Covariates: X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, X59, X60, X61, X62, X63, X64, X65, X66, X67, X68, X69, X70, X71, X72, X73, X74, X75, X76, X77, X78, X79, X80, X81, X82, X83, X84, X85, X86, X87, X88, X89, X90, X91, X92, X93, X94, X95, X96, X97, X98, X99, X100\n", "Instrument(s): \n", "No. Observations: 500\n", "\n", "------------------ Score & algorithm ------------------\n", "Score function: partialling out\n", "DML algorithm: dml2\n", "\n", "------------------ Machine learner ------------------\n", "ml_l: regr.cv_glmnet.regr.ranger.regr.rpart.regravg\n", "ml_m: regr.cv_glmnet.regr.ranger.regr.rpart.regravg\n", "\n", "------------------ Resampling ------------------\n", "No. folds: 5\n", "No. repeated sample splits: 1\n", "Apply cross-fitting: TRUE\n", "\n", "------------------ Fit summary ------------------\n", " Estimates and significance testing of the effect of target variables\n", " Estimate. Std. Error t value Pr(>|t|) \n", "d 3.88664 0.02584 150.4 <2e-16 ***\n", "---\n", "Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n", "\n", "\n" ] } ], "source": [ "# Initiate new DoubleML object and estimate with graph learner\n", "set.seed(123)\n", "obj_dml_plr_sim_pipe_ensemble = DoubleMLPLR$new(dml_data_sim,\n", " ml_l = ensemble_pipe_regr,\n", " ml_m = ensemble_pipe_regr)\n", "obj_dml_plr_sim_pipe_ensemble$fit()\n", "print(obj_dml_plr_sim_pipe_ensemble)" ] }, { "cell_type": "code", "execution_count": 17, "id": "876aee8e", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================= DoubleMLPLR Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: inuidur1\n", "Treatment variable(s): tg\n", "Covariates: female, black, othrace, dep1, dep2, q2, q3, q4, q5, q6, agelt35, agegt54, durable, lusd, husd\n", "Instrument(s): \n", "No. Observations: 5099\n", "\n", "------------------ Score & algorithm ------------------\n", "Score function: partialling out\n", "DML algorithm: dml2\n", "\n", "------------------ Machine learner ------------------\n", "ml_l: regr.cv_glmnet.regr.ranger.regr.rpart.regravg\n", "ml_m: classif.cv_glmnet.classif.ranger.classif.rpart.classifavg\n", "\n", "------------------ Resampling ------------------\n", "No. folds: 5\n", "No. repeated sample splits: 1\n", "Apply cross-fitting: TRUE\n", "\n", "------------------ Fit summary ------------------\n", " Estimates and significance testing of the effect of target variables\n", " Estimate. Std. Error t value Pr(>|t|) \n", "tg -0.07689 0.03545 -2.169 0.0301 *\n", "---\n", "Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n", "\n", "\n" ] } ], "source": [ "set.seed(123)\n", "obj_dml_plr_bonus_pipe_ensemble = DoubleMLPLR$new(dml_data_bonus,\n", " ml_l = ensemble_pipe_regr,\n", " ml_m = ensemble_pipe_classif)\n", "obj_dml_plr_bonus_pipe_ensemble$fit()\n", "print(obj_dml_plr_bonus_pipe_ensemble)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "e4ddb48a", "metadata": {}, "source": [ "Alternatively, different learners could also be stacked. Here we simply repeat the example from the [Pipelines Chapter in the mlr3book](https://mlr3book.mlr-org.com/pipelines.html#sec-pipelines-stack) in our Bonus data example." ] }, { "cell_type": "code", "execution_count": 18, "id": "25dc9006", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "lrn = lrn(\"classif.rpart\")\n", "lrn_0 = po(\"learner_cv\", lrn$clone())\n", "lrn_0$id = \"rpart_cv\"" ] }, { "cell_type": "code", "execution_count": 19, "id": "2555c7a5", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Pass original features to final estimation step\n", "level_0 = gunion(list(lrn_0, po(\"nop\")))" ] }, { "cell_type": "code", "execution_count": 20, "id": "99422ee6", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "combined = level_0 %>>% po(\"featureunion\", 2)" ] }, { "cell_type": "code", "execution_count": 21, "id": "bd7357b2", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "image/png": "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mRRdrNxrEdJDS0h32cOlfDefq5upQuLnSMMgJKXm0/yZDdPi57HpfjL5K0meFtuymeJZDLnt4Y387fH4fZS+Latu8mdDeDz86BCSVn/y59od7pTtlv9147vt2XcY3PkbZV6LiZusqo54ot3ACMmK60//ZjM9Yu3N4D8114zFN+NaSOylTyy+He0lsZVesfqG8A9E6sXyG9IWEjvpF8tvSfPvoigyYiP9Yv1taS6JbfSOHTCm4aLE5UgBtsCcWkpkpAKbYNDhlzGn/DJmNdgGq2hIFfYCEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgABCAgQQEiCAkAABhAQIICRAACEBAggJEEBIgID/B1BeS4+GzEDDAAAAAElFTkSuQmCC", "text/plain": [ "Plot with title \"\"" ] }, "metadata": { "image/png": { "height": 420, "width": 420 } }, "output_type": "display_data" } ], "source": [ "stack = combined %>>% po(\"learner\", lrn$clone())\n", "stack$plot(html = FALSE)" ] }, { "cell_type": "code", "execution_count": 22, "id": "d0d13d0c", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================= DoubleMLPLR Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: inuidur1\n", "Treatment variable(s): tg\n", "Covariates: female, black, othrace, dep1, dep2, q2, q3, q4, q5, q6, agelt35, agegt54, durable, lusd, husd\n", "Instrument(s): \n", "No. Observations: 5099\n", "\n", "------------------ Score & algorithm ------------------\n", "Score function: partialling out\n", "DML algorithm: dml2\n", "\n", "------------------ Machine learner ------------------\n", "ml_l: regr.ranger\n", "ml_m: rpart_cv.nop.featureunion.classif.rpart\n", "\n", "------------------ Resampling ------------------\n", "No. folds: 5\n", "No. repeated sample splits: 1\n", "Apply cross-fitting: TRUE\n", "\n", "------------------ Fit summary ------------------\n", " Estimates and significance testing of the effect of target variables\n", " Estimate. Std. Error t value Pr(>|t|) \n", "tg -0.07915 0.03538 -2.237 0.0253 *\n", "---\n", "Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n", "\n", "\n" ] } ], "source": [ "# Create a stacked learner and pass it to a DoubleML object\n", "stacklrn = as_learner(stack)\n", "\n", "set.seed(123)\n", "obj_dml_plr_bonus_pipe = DoubleMLPLR$new(dml_data_bonus,\n", " ml_l=ml_l_forest,\n", " ml_m=stacklrn)\n", "obj_dml_plr_bonus_pipe$fit()\n", "print(obj_dml_plr_bonus_pipe)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "6f99764a", "metadata": {}, "source": [ "## How to exploit more features of `mlr3pipelines` in `DoubleML`\n", "\n", "[mlr3pipelines](https://mlr3pipelines.mlr-org.com/reference/Graph.html) can do much more. For example, we could use it to perform some [feature engineering](https://mlr3book.mlr-org.com/pipelines.html#sec-pipelines-combined) and even perform pipeline-based [parameter tuning](https://mlr3book.mlr-org.com/pipelines.html#sec-pipelines-tuning). We just have to define the steps we want to have in our pipeline by using the PipeOps.\n", "\n", "Let's have a look at two more examples from the [Pipelines Chapter in the mlr3book](https://mlr3book.mlr-org.com/pipelines.html). In the first one, we will do some data manipulation. The second example illustrate how we could use [mlr3pipelines](https://mlr3pipelines.mlr-org.com/reference/Graph.html) for parameter tuning." ] }, { "attachments": {}, "cell_type": "markdown", "id": "347a53d1", "metadata": {}, "source": [ "### Data preprocessing\n", "\n", "Let's perform some data preprocessing and then use a regression tree for prediction." ] }, { "cell_type": "code", "execution_count": 23, "id": "2f425d59", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "mutate = po(\"mutate\")\n", "filter = po(\"filter\",\n", " filter = mlr3filters::flt(\"variance\"),\n", " param_vals = list(filter.frac = 0.5))" ] }, { "attachments": {}, "cell_type": "markdown", "id": "5a162782", "metadata": {}, "source": [ "Collect them in a graph and plot it." ] }, { "cell_type": "code", "execution_count": 24, "id": "a795412a", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "text/html": [ "\n", "
  1. 'Graph'
  2. 'R6'
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 'Graph'\n", "\\item 'R6'\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 'Graph'\n", "2. 'R6'\n", "\n", "\n" ], "text/plain": [ "[1] \"Graph\" \"R6\" " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = mutate %>>%\n", " filter %>>%\n", " po(\"learner\",\n", " learner = lrn(\"classif.rpart\"))\n", "\n", "class(graph)" ] }, { "cell_type": "code", "execution_count": 25, "id": "d2ce3898", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "Plot with title \"\"" ] }, "metadata": { "image/png": { "height": 420, "width": 420 } }, "output_type": "display_data" } ], "source": [ "graph$plot()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "11860a7e", "metadata": {}, "source": [ "Create a new learner." ] }, { "cell_type": "code", "execution_count": 26, "id": "5e449f23", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "glrn = as_learner(graph)" ] }, { "cell_type": "code", "execution_count": 27, "id": "909193b3", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "text/plain": [ "\n", "* Model: -\n", "* Parameters: mutate.mutation=, mutate.delete_originals=FALSE,\n", " variance.filter.frac=0.5, classif.rpart.xval=0\n", "* Packages: mlr3, mlr3pipelines, rpart\n", "* Predict Types: [response], prob\n", "* Feature Types: logical, integer, numeric, character, factor, ordered,\n", " POSIXct\n", "* Properties: featureless, hotstart_backward, hotstart_forward,\n", " importance, loglik, missings, multiclass, oob_error,\n", " selected_features, twoclass, weights" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
  1. 'GraphLearner'
  2. 'Learner'
  3. 'R6'
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 'GraphLearner'\n", "\\item 'Learner'\n", "\\item 'R6'\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 'GraphLearner'\n", "2. 'Learner'\n", "3. 'R6'\n", "\n", "\n" ], "text/plain": [ "[1] \"GraphLearner\" \"Learner\" \"R6\" " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "glrn\n", "class(glrn)" ] }, { "cell_type": "code", "execution_count": 28, "id": "96a281d1", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================= DoubleMLPLR Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: inuidur1\n", "Treatment variable(s): tg\n", "Covariates: female, black, othrace, dep1, dep2, q2, q3, q4, q5, q6, agelt35, agegt54, durable, lusd, husd\n", "Instrument(s): \n", "No. Observations: 5099\n", "\n", "------------------ Score & algorithm ------------------\n", "Score function: partialling out\n", "DML algorithm: dml2\n", "\n", "------------------ Machine learner ------------------\n", "ml_l: regr.cv_glmnet\n", "ml_m: mutate.variance.classif.rpart\n", "\n", "------------------ Resampling ------------------\n", "No. folds: 5\n", "No. repeated sample splits: 1\n", "Apply cross-fitting: TRUE\n", "\n", "------------------ Fit summary ------------------\n", " Estimates and significance testing of the effect of target variables\n", " Estimate. Std. Error t value Pr(>|t|) \n", "tg -0.07366 0.03539 -2.081 0.0374 *\n", "---\n", "Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n", "\n", "\n" ] } ], "source": [ "set.seed(123)\n", "obj_dml_plr_bonus_pipe2 = DoubleMLPLR$new(dml_data_bonus,\n", " ml_l=ml_l_lasso,\n", " ml_m=glrn)\n", "obj_dml_plr_bonus_pipe2$fit()\n", "print(obj_dml_plr_bonus_pipe2)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "1d552c2f", "metadata": {}, "source": [ "Let's see how to set hyperparameters with a pipeline." ] }, { "cell_type": "code", "execution_count": 29, "id": "27513f2e", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "glrn$param_set$values$variance.filter.frac = 0.25" ] }, { "cell_type": "code", "execution_count": 30, "id": "3f35dca9", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================= DoubleMLPLR Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: inuidur1\n", "Treatment variable(s): tg\n", "Covariates: female, black, othrace, dep1, dep2, q2, q3, q4, q5, q6, agelt35, agegt54, durable, lusd, husd\n", "Instrument(s): \n", "No. Observations: 5099\n", "\n", "------------------ Score & algorithm ------------------\n", "Score function: partialling out\n", "DML algorithm: dml2\n", "\n", "------------------ Machine learner ------------------\n", "ml_l: regr.cv_glmnet\n", "ml_m: mutate.variance.classif.rpart\n", "\n", "------------------ Resampling ------------------\n", "No. folds: 5\n", "No. repeated sample splits: 1\n", "Apply cross-fitting: TRUE\n", "\n", "------------------ Fit summary ------------------\n", " Estimates and significance testing of the effect of target variables\n", " Estimate. Std. Error t value Pr(>|t|) \n", "tg -0.07366 0.03539 -2.081 0.0374 *\n", "---\n", "Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n", "\n", "\n" ] } ], "source": [ "set.seed(123)\n", "obj_dml_plr_bonus_pipe3 = DoubleMLPLR$new(dml_data_bonus,\n", " ml_l=ml_l_lasso,\n", " ml_m=glrn)\n", "obj_dml_plr_bonus_pipe3$fit()\n", "print(obj_dml_plr_bonus_pipe3)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "2f90db3e", "metadata": {}, "source": [ "### Parameter tuning\n", "\n", "Next, we will shortly illustrate how to perform parameter tuning in the simulated data example. Here, we use a pipeline to tune the penalty of the lasso. To do so, we generate a [GraphLearner](https://mlr3pipelines.mlr-org.com/reference/mlr_learners_graph.html) and then call [DoubleML](https://docs.doubleml.org)'s [tune()](https://docs.doubleml.org/r/stable/reference/DoubleML.html#method-tune-) method." ] }, { "attachments": {}, "cell_type": "markdown", "id": "e1cf206d", "metadata": {}, "source": [ "Let's define a [GraphLearner](https://mlr3pipelines.mlr-org.com/reference/mlr_learners_graph.html) based on the lasso." ] }, { "cell_type": "code", "execution_count": 31, "id": "935daf2f", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "lasso_pipe = mutate %>>%\n", " filter %>>%\n", " po(\"learner\",\n", " learner = lrn(\"regr.glmnet\"))\n", "glrn_lasso = as_learner(lasso_pipe)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "4690daa8", "metadata": {}, "source": [ "Let's specify the parameter grid and more settings that are required for the parameter tuning. For more details, we refer to [the DoubleML user guide](https://docs.doubleml.org/stable/guide/learners.html#r-learners-and-hyperparameters). " ] }, { "cell_type": "code", "execution_count": 32, "id": "b9a50aa8", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message:\n", "\"Paket 'paradox' wurde unter R Version 4.2.3 erstellt\"\n" ] } ], "source": [ "# Parameter grid for lambda and for optimal variance filter fraction\n", "library(paradox)\n", "par_grids = ps(regr.glmnet.lambda = p_dbl(lower = 0.05, upper = 0.1),\n", " variance.filter.frac = p_dbl(lower = 0.25, upper = 1))" ] }, { "cell_type": "code", "execution_count": 33, "id": "4ec8264d", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Specify further tune settings\n", "library(mlr3tuning)\n", "tune_settings = list(terminator = trm(\"evals\", n_evals = 10),\n", " algorithm = tnr(\"grid_search\", resolution = 10),\n", " rsmp_tune = rsmp(\"cv\", folds = 5),\n", " measure = list(\"ml_l\" = msr(\"regr.mse\"),\n", " \"ml_m\" = msr(\"regr.mse\")))" ] }, { "cell_type": "code", "execution_count": 34, "id": "4885bebd", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO [12:57:48.469] [bbotk] Starting to optimize 2 parameter(s) with '' and ' [n_evals=10, k=0]'\n", "INFO [12:57:48.485] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:49.133] [bbotk] Result of batch 1:\n", "INFO [12:57:49.135] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:49.135] [bbotk] 0.07222222 0.6666667 107.2925 0 0\n", "INFO [12:57:49.135] [bbotk] runtime_learners uhash\n", "INFO [12:57:49.135] [bbotk] 0.38 5574dcd4-fc9e-463b-9345-d21ee5775b5f\n", "INFO [12:57:49.137] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:49.514] [bbotk] Result of batch 2:\n", "INFO [12:57:49.516] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:49.516] [bbotk] 0.1 0.6666667 106.2652 0 0\n", "INFO [12:57:49.516] [bbotk] runtime_learners uhash\n", "INFO [12:57:49.516] [bbotk] 0.32 8497f641-2700-4a53-ae89-5cb31a99b9cc\n", "INFO [12:57:49.517] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:49.892] [bbotk] Result of batch 3:\n", "INFO [12:57:49.893] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:49.893] [bbotk] 0.1 0.4166667 482.9753 0 0\n", "INFO [12:57:49.893] [bbotk] runtime_learners uhash\n", "INFO [12:57:49.893] [bbotk] 0.33 f3d24993-a09b-432f-ab71-44fa97767be8\n", "INFO [12:57:49.894] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:50.273] [bbotk] Result of batch 4:\n", "INFO [12:57:50.274] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:50.274] [bbotk] 0.09444444 0.75 112.1054 0 0\n", "INFO [12:57:50.274] [bbotk] runtime_learners uhash\n", "INFO [12:57:50.274] [bbotk] 0.3 bb2913dc-3cd0-4b8f-a09a-303f00f0bd62\n", "INFO [12:57:50.276] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:50.657] [bbotk] Result of batch 5:\n", "INFO [12:57:50.659] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:50.659] [bbotk] 0.08333333 0.9166667 10.81856 0 0\n", "INFO [12:57:50.659] [bbotk] runtime_learners uhash\n", "INFO [12:57:50.659] [bbotk] 0.28 8da924ce-f2e7-4dd2-a840-b5d34a6f42be\n", "INFO [12:57:50.660] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:51.051] [bbotk] Result of batch 6:\n", "INFO [12:57:51.053] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:51.053] [bbotk] 0.08888889 0.9166667 10.74189 0 0\n", "INFO [12:57:51.053] [bbotk] runtime_learners uhash\n", "INFO [12:57:51.053] [bbotk] 0.29 0434e374-ddc9-468d-b208-dc13a11076b3\n", "INFO [12:57:51.054] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:51.433] [bbotk] Result of batch 7:\n", "INFO [12:57:51.435] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:51.435] [bbotk] 0.07777778 0.5833333 201.8513 0 0\n", "INFO [12:57:51.435] [bbotk] runtime_learners uhash\n", "INFO [12:57:51.435] [bbotk] 0.26 280454dd-5804-498f-80a8-24080030a4de\n", "INFO [12:57:51.436] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:51.868] [bbotk] Result of batch 8:\n", "INFO [12:57:51.869] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:51.869] [bbotk] 0.07222222 0.3333333 531.5255 0 0\n", "INFO [12:57:51.869] [bbotk] runtime_learners uhash\n", "INFO [12:57:51.869] [bbotk] 0.32 7b428990-305b-47be-bde4-7215093d9089\n", "INFO [12:57:51.871] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:52.316] [bbotk] Result of batch 9:\n", "INFO [12:57:52.318] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:52.318] [bbotk] 0.06111111 0.9166667 11.17823 0 0\n", "INFO [12:57:52.318] [bbotk] runtime_learners uhash\n", "INFO [12:57:52.318] [bbotk] 0.34 bd929a9e-3e1c-4fee-ae56-f00584a57972\n", "INFO [12:57:52.319] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:52.773] [bbotk] Result of batch 10:\n", "INFO [12:57:52.775] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:52.775] [bbotk] 0.08888889 0.25 538.991 0 0\n", "INFO [12:57:52.775] [bbotk] runtime_learners uhash\n", "INFO [12:57:52.775] [bbotk] 0.38 e20ea26e-a6ba-4539-a3d9-0005a80b528f\n", "INFO [12:57:52.780] [bbotk] Finished optimizing after 10 evaluation(s)\n", "INFO [12:57:52.780] [bbotk] Result:\n", "INFO [12:57:52.782] [bbotk] regr.glmnet.lambda variance.filter.frac learner_param_vals x_domain regr.mse\n", "INFO [12:57:52.782] [bbotk] 0.08888889 0.9166667 10.74189\n", "INFO [12:57:52.869] [bbotk] Starting to optimize 2 parameter(s) with '' and ' [n_evals=10, k=0]'\n", "INFO [12:57:52.871] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:53.298] [bbotk] Result of batch 1:\n", "INFO [12:57:53.299] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:53.299] [bbotk] 0.08888889 0.5833333 12.6173 0 0\n", "INFO [12:57:53.299] [bbotk] runtime_learners uhash\n", "INFO [12:57:53.299] [bbotk] 0.35 67ad635a-5346-41e5-b5d7-a79359d2da46\n", "INFO [12:57:53.301] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:53.723] [bbotk] Result of batch 2:\n", "INFO [12:57:53.725] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:53.725] [bbotk] 0.1 0.5833333 12.5155 0 0\n", "INFO [12:57:53.725] [bbotk] runtime_learners uhash\n", "INFO [12:57:53.725] [bbotk] 0.34 921e4f0d-e57c-4552-a5e6-8bdee1a1d83d\n", "INFO [12:57:53.726] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:54.130] [bbotk] Result of batch 3:\n", "INFO [12:57:54.132] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:54.132] [bbotk] 0.08333333 0.75 0.9870004 0 0\n", "INFO [12:57:54.132] [bbotk] runtime_learners uhash\n", "INFO [12:57:54.132] [bbotk] 0.3 26bd56a6-fd8a-4dba-9109-0ff823b17d45\n", "INFO [12:57:54.133] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:54.574] [bbotk] Result of batch 4:\n", "INFO [12:57:54.576] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:54.576] [bbotk] 0.07222222 0.5 17.75887 0 0\n", "INFO [12:57:54.576] [bbotk] runtime_learners uhash\n", "INFO [12:57:54.576] [bbotk] 0.34 fb5c25fa-1596-49d4-b371-d0cdb0ea4795\n", "INFO [12:57:54.577] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:55.015] [bbotk] Result of batch 5:\n", "INFO [12:57:55.017] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:55.017] [bbotk] 0.08333333 0.5833333 12.6722 0 0\n", "INFO [12:57:55.017] [bbotk] runtime_learners uhash\n", "INFO [12:57:55.017] [bbotk] 0.33 ee97bda7-6cea-440a-9248-d5a0c70f1d98\n", "INFO [12:57:55.018] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:55.452] [bbotk] Result of batch 6:\n", "INFO [12:57:55.453] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:55.453] [bbotk] 0.07222222 0.5833333 12.78818 0 0\n", "INFO [12:57:55.453] [bbotk] runtime_learners uhash\n", "INFO [12:57:55.453] [bbotk] 0.29 8e3aa840-c895-472e-85c5-681817dcfcda\n", "INFO [12:57:55.455] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:55.913] [bbotk] Result of batch 7:\n", "INFO [12:57:55.915] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:55.915] [bbotk] 0.07777778 0.5 17.69921 0 0\n", "INFO [12:57:55.915] [bbotk] runtime_learners uhash\n", "INFO [12:57:55.915] [bbotk] 0.36 4552b8af-3647-43f0-a5e7-55dc37e31fb1\n", "INFO [12:57:55.917] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:56.386] [bbotk] Result of batch 8:\n", "INFO [12:57:56.387] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:56.387] [bbotk] 0.07777778 0.9166667 0.9880384 0 0\n", "INFO [12:57:56.387] [bbotk] runtime_learners uhash\n", "INFO [12:57:56.387] [bbotk] 0.31 abb0fd28-0359-4ecd-8644-f1718fdeb9b0\n", "INFO [12:57:56.389] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:56.783] [bbotk] Result of batch 9:\n", "INFO [12:57:56.785] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:56.785] [bbotk] 0.07777778 0.4166667 22.43294 0 0\n", "INFO [12:57:56.785] [bbotk] runtime_learners uhash\n", "INFO [12:57:56.785] [bbotk] 0.26 cda85647-3ec2-4849-88ad-193f0d909729\n", "INFO [12:57:56.786] [bbotk] Evaluating 1 configuration(s)\n", "INFO [12:57:57.183] [bbotk] Result of batch 10:\n", "INFO [12:57:57.185] [bbotk] regr.glmnet.lambda variance.filter.frac regr.mse warnings errors\n", "INFO [12:57:57.185] [bbotk] 0.07222222 0.3333333 27.31378 0 0\n", "INFO [12:57:57.185] [bbotk] runtime_learners uhash\n", "INFO [12:57:57.185] [bbotk] 0.31 caac5a95-4462-42ba-99c8-ca1af7be64b2\n", "INFO [12:57:57.189] [bbotk] Finished optimizing after 10 evaluation(s)\n", "INFO [12:57:57.190] [bbotk] Result:\n", "INFO [12:57:57.191] [bbotk] regr.glmnet.lambda variance.filter.frac learner_param_vals x_domain regr.mse\n", "INFO [12:57:57.191] [bbotk] 0.08333333 0.75 0.9870004\n" ] } ], "source": [ "# Initiate new DoubleML object and execute tuning with graph learner\n", "set.seed(123)\n", "obj_dml_plr_sim_pipe_tune = DoubleMLPLR$new(dml_data_sim,\n", " ml_l=glrn_lasso,\n", " ml_m=glrn_lasso)\n", "obj_dml_plr_sim_pipe_tune$tune(param_set = list(\"ml_l\" = par_grids,\n", " \"ml_m\" = par_grids),\n", " tune_settings=tune_settings)" ] }, { "cell_type": "code", "execution_count": 35, "id": "839a8c99", "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "================= DoubleMLPLR Object ==================\n", "\n", "\n", "------------------ Data summary ------------------\n", "Outcome variable: y\n", "Treatment variable(s): d\n", "Covariates: X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, X59, X60, X61, X62, X63, X64, X65, X66, X67, X68, X69, X70, X71, X72, X73, X74, X75, X76, X77, X78, X79, X80, X81, X82, X83, X84, X85, X86, X87, X88, X89, X90, X91, X92, X93, X94, X95, X96, X97, X98, X99, X100\n", "Instrument(s): \n", "No. Observations: 500\n", "\n", "------------------ Score & algorithm ------------------\n", "Score function: partialling out\n", "DML algorithm: dml2\n", "\n", "------------------ Machine learner ------------------\n", "ml_l: regr.cv_glmnet\n", "ml_m: regr.cv_glmnet\n", "\n", "------------------ Resampling ------------------\n", "No. folds: 5\n", "No. repeated sample splits: 1\n", "Apply cross-fitting: TRUE\n", "\n", "------------------ Fit summary ------------------\n", " Estimates and significance testing of the effect of target variables\n", " Estimate. Std. Error t value Pr(>|t|) \n", "d 3.00133 0.04424 67.84 <2e-16 ***\n", "---\n", "Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n", "\n", "\n" ] } ], "source": [ "obj_dml_plr_sim_pipe$fit()\n", "print(obj_dml_plr_sim_pipe)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "b562abbe", "metadata": {}, "source": [ "## References\n", "\n", "Becker, M., Binder, M., Bischl, B., Lang, M., Pfisterer, F., Reich, N.G., Richter, J., Schratz, P., Sonabend, R. (2020), mlr3 book, available at https://mlr3book.mlr-org.com.\n", "\n", "Binder, M., Pfisterer, F., Lang, M., Schneider, L., Kotthof, L., and Bischl, B. (2021), mlr3pipelines - flexible machine learning pipelines in R, Journal of Machine Learning Research, 22(184): 1-7, https://jmlr.org/papers/v22/21-0281.html.\n", "\n", "Lang, M., Binder, M., Richter, J., Schratz, P., Pfisterer, F., Coors, S., Au, Q., Casalicchio, G., Kotthoff, L., Bischl, B. (2019), mlr3: A modern object-oriented machine learing framework in R. Journal of Open Source Software, [doi:10.21105/joss.01903](https://doi.org/10.21105/joss.01903).\n", "\n", "Lang, M., Au, Q., Coors, S., and Schratz, P. (2021), mlr3learners: Recommended learners for mlr3, R package, https://CRAN.R-project.org/package=mlr3learners.\n", "\n", "Sonabend, R., and Schratz, P. (2021), extralearners: Extra learners for mlr3. R package, https://mlr3extralearners.mlr-org.com/." ] }, { "attachments": {}, "cell_type": "markdown", "id": "0ba7fae8", "metadata": {}, "source": [ "______\n", "\n", "**Acknowledgement**\n", "\n", "We would like to thank the developers of the [mlr3pipelines](https://mlr3pipelines.mlr-org.com/) package for providing such a powerful and easy-to-use implementation of many important ML tools." ] } ], "metadata": { "kernelspec": { "display_name": "R", "language": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "4.2.2" } }, "nbformat": 4, "nbformat_minor": 5 }