dml_core/lib.rs
1//! # dml-core
2//!
3//! Double / debiased machine learning (Chernozhukov et al., 2018) in Rust.
4//!
5//! ## Models
6//!
7//! - [`Plr`]: partially linear regression (partialling-out or IV-type score)
8//! - [`Irm`]: interactive regression model for a binary treatment (ATE / ATTE)
9//! - [`Pliv`]: partially linear IV regression
10//!
11//! All three have scores that are linear in θ and share one engine
12//! ([`fit_model`]): repeated cross-fitting, DML2 estimation, standard errors,
13//! confidence intervals, a multiplier [`Bootstrap`] for joint inference and
14//! multiple-testing adjustment. New scores plug in via [`LinearScoreModel`].
15//!
16//! ## Heterogeneous effects
17//!
18//! - [`SLearner`], [`TLearner`], [`XLearner`], [`RLearner`], [`DrLearner`]: CATE meta-learners
19//! - [`Blp`]: best linear predictor of the CATE and group average effects (GATE) with
20//! robust inference, from [`DrLearner`] fits or [`DmlFit::cate`] / [`DmlFit::gate`]
21//!
22//! ## Building blocks
23//!
24//! - [`DmlData`]: outcome `y`, one or more treatments `d`, covariates `x`, optional instrument `z`
25//! - [`Regressor`] / [`Classifier`]: plug-in nuisance learners
26//! ([`Ols`], [`Lasso`], [`LogisticRegression`] built in)
27//! - [`KFold`] / [`SampleSplitting`]: reproducible sample splitting
28//!
29//! ```
30//! use dml_core::{DmlData, Ols, Plr};
31//! use ndarray::{Array1, Array2};
32//!
33//! let n = 200;
34//! let x = Array2::from_shape_fn((n, 2), |(i, j)| ((i * 7 + j * 3) % 11) as f64);
35//! let d: Array1<f64> = (0..n).map(|i| x[[i, 0]] + ((i * 13) % 5) as f64).collect();
36//! let y: Array1<f64> = (0..n).map(|i| 0.5 * d[i] - x[[i, 1]] + ((i * 17) % 3) as f64).collect();
37//!
38//! let fit = Plr::new(Ols::new(), Ols::new()).n_folds(5).seed(42).fit(&DmlData::new(y, d, x)?)?;
39//! assert!((fit.coef()[0] - 0.5).abs() < 0.1);
40//! let ci = fit.confint(0.95)?; // shape (n_treat, 2)
41//! # let _ = ci;
42//! # Ok::<(), dml_core::DmlError>(())
43//! ```
44
45pub mod blp;
46pub mod bootstrap;
47pub mod cate;
48pub mod crossfit;
49pub mod data;
50pub mod error;
51pub mod fit;
52pub mod learner;
53pub(crate) mod linalg;
54pub mod model;
55pub mod score;
56pub mod stats;
57
58pub use blp::Blp;
59pub use bootstrap::{Bootstrap, BootstrapMethod};
60pub use cate::{CateFit, DrLearner, RLearner, SLearner, TLearner, XLearner};
61pub use crossfit::{
62 cross_fit_predict, cross_fit_predict_proba, cross_fit_predict_subset, Fold, KFold,
63 SampleSplitting,
64};
65pub use data::DmlData;
66pub use error::{DmlError, Result};
67pub use fit::{fit_model, DmlFit, PAdjust};
68pub use learner::{Classifier, Lasso, LogisticRegression, Ols, Regressor};
69pub use model::{Irm, IrmScore, LinearScoreModel, Pliv, Plr, PlrScore, ScoreEstimate, ScoreInput};
70pub use score::LinearScore;