///|
/// 示例 2 —— 同一个「一例一包」的样式,换成第二个估计器:`DoubleMLIRM`。
///
///   moon run examples/irm
///
/// 用来印证它的 README 那句话:`DoubleMLXxx::new(...).fit()` 与 `.coef()/.se()/.confint()`
/// 在所有估计器上形状一致。
///
/// 注意 IRM 的**倾向得分**要传 logistic 学习器:处理变量是 0/1,用线性回归去拟合
/// 倾向得分会让 m̂ 越出 [0,1],权重随之爆炸(第一次跑出 −1520 就是这么来的)。
fn main {
  let data = @dml.make_irm_data(500, 5, 1.0, 3141)
  let dml_data = @dml.DoubleMLData::new(
    data.x_get(),
    data.y_get(),
    data.d_get(),
  )
  let fitted = @dml.DoubleMLIRM::new(
    dml_data,
    n_folds=5,
    ml_m=@dml.LearnerDispatch::logistic_regression(
      @dml.LogisticRegression::new(),
    ),
  ).fit()
  let (lo, hi) = fitted.confint()
  println(
    "=== MoonBit DML IRM(数据取自 riantr/moonbit_doubleML 的 DGP)===",
  )
  println("true theta_0      = \{data.theta_get()}")
  println("estimated theta   = \{fitted.coef()}")
  println("standard error    = \{fitted.se()}")
  println("95% CI            = [\{lo}, \{hi}]")
}