Causal Inference in R 中文版

Authors

Malcolm Barrett, et al.

陆震(译)

Published

November 12, 2025

前言

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

对于因果问题的回答,在科学研究与商业用途中都具有重要意义。但是现实中,诸如随机临床试验与 A/B 测试等因果推断方法并不总是可行的。因此,我们需要借助观察数据来进行因果推断。本书将介绍如何使用 R 语言进行因果推断,以及如何使用现代因果推断方法来解决实际问题。通过本书,您将学习到:

  1. 更好地理解因果推断的基本概念;
  2. 理解因果推断的假设;
  3. 准确识别进行因果推断的目标人群;
  4. 使用现代因果推断方法来解决实际问题;
  5. 进行因果推断的敏感性分析。

本书的目标读者是数据科学家、数据分析师、科学研究人员以及对因果推断感兴趣的读者。尽管在现实中,提问的因果问题可能是不同的,如“医学中癌症相关因果问题”或“某个广告点击率的因果关系”等,但是这些问题背后的因果推断方法是相通的。本书中,我们使用来自医学、经济以及科技相关方面的例子来具体地阐释因果推断。需要提醒大家的是,由于本书聚焦于借助观察数据进行因果推断,因此本书并不会涉及到随机临床试验、A/B 测试的内容。

在阅读本书前,我们建议您具备以下知识:

  1. 熟悉 tidyverse 生态系统中的 R 包及其总体理念。例如,我们在本书中大量使用 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。)
  4. 另外,本书还将使用 tidymodels 生态系统中的工具,这是一组与 tidyverse 相关的 R 包,用于建模。但 tidymodels 也专注于预测模型的构建,因此它的许多工具并不适用于本书。然而,如果您对这个主题感兴趣,我们推荐阅读 Tidy Modeling with R

还有几本关于因果推断的优秀书籍。本书的重点是基于 R 进行因果推断,但从其他角度了解这个领域也是有帮助的。您可能会喜欢这几本书:

第一本书侧重于流行病学。后两本书侧重于计量经济学。我们还推荐阅读 The Book of Why Pearl and Mackenzie (2018) 以了解更多关于因果图的信息。

本书约定

现代 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,
    ...
  )
}