Causal Inference in R 中文版

Authors

Malcolm Barrett, Lucy D’Agostino McGowan, Travis Gerke

陆震(译)

Published

July 30, 2026

前言

欢迎来到 Causal Inference in R 中文版。本书中文版内容的翻译由陆震完成并维护。目前本书中文版内容还没有纸质出版,如果读者是出版人员,并有意愿负责出版本书,请通过 联系我。

回答因果问题对于科学和商业目的都至关重要,但随机临床试验和 A/B 测试等技术并不总是可行或成功。本书中的工具将帮助读者使用 R 编程语言,更好地基于观察性数据进行因果推断。读完本书后,我们希望帮助你:

  1. 提出更好的因果问题;
  2. 理解因果推断所需的假设;
  3. 识别你希望对其进行推断的目标人群;
  4. 拟合因果模型并检查其中的问题;
  5. 在所用技术可能并不完美的情况下开展敏感性分析。

本书面向学术研究者和数据科学家。尽管这两类场景中的问题可能不同,但许多技术是相同的:因果推断既有助于提出关于癌症的问题,也有助于提出关于点击的问题。我们使用来自医学、经济学、科技和其他领域的混合例子来说明:你需要一个清楚的因果问题,并愿意透明地说明自己的假设。

你会在本书中学到很多,但讽刺的是,你不会学到太多关于如何开展随机试验的内容,而随机试验是进行因果推断的最佳工具之一。随机试验及其近亲 A/B 测试(在科技行业中很常见)之所以有吸引力,是因为它们能减轻许多为了有效推断而需要作出的假设。它们在设计上也足够复杂,值得拥有自己的学习资源。相反,我们会聚焦于观察性数据,在这类数据中,我们通常无法从随机化中受益。如果你对随机化技术感兴趣,也先不要把这份资源放到一边:许多为观察性数据设计的因果推断技术,同样能改进随机化分析。

我们对作为读者的你作出了一些假设:

  1. 你熟悉 R 包 tidyverse 生态系统及其总体理念。例如,本书会大量使用 dplyr 和 ggplot2,但不会解释它们的基础语法。若想了解如何开始使用 tidyverse,我们推荐 R for Data Science
  2. 你熟悉 R 中的基础统计建模。例如,我们会用 lm()glm() 拟合许多模型,但不会讨论它们的工作原理。如果你想进一步了解 R 强大的建模函数,我们推荐阅读 Tidy Modeling with R 中的 “A Review of R Modeling Fundamentals”
  3. 我们还假设你熟悉其他 R 基础知识,例如编写函数R for Data Science 也是学习这些主题的好资源。(若想更深入学习 R 编程语言,我们推荐 Advanced R,不过本书并不假设你已经掌握其中内容。)

我们还会使用 tidymodels 生态系统中的工具,这是一组与 tidyverse 相关、用于建模的 R 包。我们并不假设你以前用过它们。tidymodels 也聚焦于预测建模,因此其中许多工具并不适合本书。尽管如此,如果你对这个主题感兴趣,我们推荐 Tidy Modeling with R

关于因果推断,还有几本其他优秀书籍。本书的不同之处在于它聚焦于 R,但从其他视角理解这一领域仍然很有帮助。你可能会喜欢以下几本书:

第一本书聚焦于流行病学。后两本书聚焦于计量经济学。关于因果图,我们还推荐 The Book of Why Pearl and Mackenzie (2018)

安装

本书使用了几个正在积极开发中的包。要安装所需的开发版本,请使用:

# install.packages("pak")
pak::pak(c(
  "r-causal/causalworkshop",
  "r-causal/ggdag",
  "r-causal/halfmoon",
  "r-causal/propensity",
  "r-causal/tipr",
  "LucyMcGowan/touringplans"
))

这些开发版本包含本书通篇使用的最新功能和错误修复。

约定

现代 R 特性

本书使用 R 4.1.0 及以上版本中的两个现代 R 特性。第一个是原生管道 |>。这个 R 特性类似于 tidyverse 的 %>%,后者你可能更熟悉。在典型情况下,两者可以互换使用。一个显著差异是,|> 使用 _ 符号来指向管道结果,例如 .df |> lm(y ~ x, data = _)。更多内容见这篇 Tidyverse 博客文章

我们使用的另一个现代 R 特性是原生 lambda,它是一种编写短函数的方式,形式如 \(.x) do_something(.x)。它类似于 purrr 的 ~ lambda 记法。还需要认识到,原生 lambda 与 function(.x) do_something(.x) 完全相同,其中 \function 的简写。更多内容见 R for Data Science 关于迭代的章节

主题

本书中的图使用统一主题,但我们不会在每个代码块中都包含这些设置;这意味着如果你运行某个可视化的代码,可能会得到外观略有不同的结果。我们设置了以下与 ggplot2 相关的默认值:

options(
  # 将 ggplot2 中的默认颜色设置为色盲友好
  # Okabe-Ito 和 Viridis 调色板
  ggplot2.discrete.colour = ggokabeito::palette_okabe_ito(),
  ggplot2.discrete.fill = ggokabeito::palette_okabe_ito(),
  ggplot2.continuous.colour = "viridis",
  ggplot2.continuous.fill = "viridis",
  # 设置主题字体和大小
  book.base_family = "sans",
  book.base_size = 14
)

library(ggplot2)

# 设置默认主题
theme_set(
  theme_minimal(
    base_size = getOption("book.base_size"),
    base_family = getOption("book.base_family")
  ) %+replace%
    theme(
      panel.grid.minor = element_blank(),
      legend.position = "bottom"
    )
)

我们还屏蔽了几个来自 ggdag、且我们希望自定义的函数:

theme_dag <- function() {
  ggdag::theme_dag(base_family = getOption("book.base_family"))
}

geom_dag_label_repel <- function(..., seed = 10) {
  ggdag::geom_dag_label_repel(
    aes(x, y, label = label),
    box.padding = 3.5,
    inherit.aes = FALSE,
    max.overlaps = Inf,
    family = getOption("book.base_family"),
    seed = seed,
    label.size = NA,
    label.padding = 0.1,
    size = getOption("book.base_size") / 3,
    ...
  )
}

许可证

本作品采用 CC BY-NC 4.0 许可:“本许可证要求再使用者注明创作者。它允许再使用者出于非商业目的,以任何媒介或格式分发、混编、改编和基于本材料进行创作。”

本书中的代码也可根据 MIT license 使用。根据 MIT 许可证,只要注明来源,你可以在自己的工作中自由使用这些代码。