Skip to content

Commit a8fd80a

Browse files
authored
Merge pull request #12 from pumc-zhou/main
create a website for this book by Quarto
2 parents a751c77 + 61dd75c commit a8fd80a

File tree

262 files changed

+42609
-663
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

262 files changed

+42609
-663
lines changed

.github/workflows/deploy-pages.yml

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
name: Deploy Quarto site to GitHub Pages
2+
3+
on:
4+
push:
5+
branches: [main]
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
pages: write
11+
id-token: write
12+
13+
concurrency:
14+
group: "pages"
15+
cancel-in-progress: true
16+
17+
jobs:
18+
build:
19+
runs-on: ubuntu-latest
20+
steps:
21+
- name: Checkout
22+
uses: actions/checkout@v4
23+
24+
- name: Setup Python
25+
uses: actions/setup-python@v5
26+
with:
27+
python-version: "3.11"
28+
29+
- name: Install Python dependencies
30+
run: |
31+
python -m pip install --upgrade pip
32+
pip install -r requirements.txt
33+
34+
- name: Setup Quarto
35+
uses: quarto-dev/quarto-actions/setup@v2
36+
37+
- name: Render site
38+
uses: quarto-dev/quarto-actions/render@v2
39+
40+
- name: Setup Pages
41+
uses: actions/configure-pages@v5
42+
43+
- name: Upload artifact
44+
uses: actions/upload-pages-artifact@v3
45+
with:
46+
path: docs
47+
48+
deploy:
49+
environment:
50+
name: github-pages
51+
url: ${{ steps.deployment.outputs.page_url }}
52+
runs-on: ubuntu-latest
53+
needs: build
54+
steps:
55+
- name: Deploy to GitHub Pages
56+
id: deployment
57+
uses: actions/deploy-pages@v4

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/.quarto/
2+
**/*.quarto_ipynb

.vscode/settings.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"python-envs.defaultEnvManager": "ms-python.python:conda",
3+
"python-envs.defaultPackageManager": "ms-python.python:conda"
4+
}

README.md

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,119 @@
4646
20 | 第二十章: 即插即用的估计量|   2022-10-10
4747
21 | 第二十一章: 元学习器|   2022-11-15
4848

49-
该书遵守[MIT License](./LICENSE)
49+
该书遵守[MIT License](./LICENSE)
50+
51+
## 本地运行指南 2026-03-02
52+
53+
### 安装 python 及相关程序
54+
55+
建议使用 **Python 3.10 ~ 3.12**。Windows 用户优先推荐安装 [Miniconda](https://docs.conda.io/en/latest/miniconda.html),也可以使用官方 Python。
56+
57+
此外建议安装:
58+
59+
- [Git](https://git-scm.com/)
60+
- [VS Code](https://code.visualstudio.com/)(可选,但推荐)
61+
- Jupyter(会在下方通过 `pip` 安装)
62+
63+
### 获取项目代码
64+
65+
```bash
66+
git clone https://github.com/xieliaing/CausalInferenceIntro.git
67+
cd CausalInferenceIntro
68+
```
69+
70+
### 创建并激活虚拟环境(推荐)
71+
72+
#### 方案 A:使用 conda(推荐)
73+
74+
```bash
75+
conda create -n causal-intro python=3.11 -y
76+
conda activate causal-intro
77+
```
78+
79+
#### 方案 B:使用 venv
80+
81+
```bash
82+
python -m venv .venv
83+
```
84+
85+
Windows PowerShell:
86+
87+
```powershell
88+
.\.venv\Scripts\Activate.ps1
89+
```
90+
91+
macOS / Linux:
92+
93+
```bash
94+
source .venv/bin/activate
95+
```
96+
97+
### 安装依赖
98+
99+
项目中的 Notebook 主要依赖如下(可先安装最小集合):
100+
101+
```bash
102+
pip install -U pip
103+
pip install jupyter notebook jupyterlab numpy pandas scipy matplotlib seaborn scikit-learn statsmodels linearmodels graphviz
104+
```
105+
106+
如果你需要运行翻译脚本 `AutoTranslateNotebooks.py`,再额外安装:
107+
108+
```bash
109+
pip install nbformat googletrans==4.0.0-rc1
110+
```
111+
112+
或者你可以直接使用如下命令安装本项目所需的依赖项:
113+
114+
```bash
115+
pip install -r requirements.txt
116+
```
117+
118+
### 启动并运行 Notebook
119+
120+
在仓库根目录运行:
121+
122+
```bash
123+
jupyter lab
124+
```
125+
126+
或:
127+
128+
```bash
129+
jupyter notebook
130+
```
131+
132+
然后在浏览器中打开 `chapters/` 目录,按顺序运行对应章节。
133+
134+
### 可选:运行翻译脚本
135+
136+
```bash
137+
python AutoTranslateNotebooks.py "chapters/01 第一章-因果关系入门.ipynb" "chapters/01 第一章-因果关系入门_机器翻译.ipynb"
138+
```
139+
140+
说明:
141+
142+
- 第 1 个参数是输入 Notebook
143+
- 第 2 个参数是输出 Notebook
144+
- 若出现翻译 API 报错,请稍后重试或更换网络环境
145+
146+
### 常见问题
147+
148+
1. **命令找不到(python / pip / jupyter)**
149+
- 请确认已激活虚拟环境,或将 Python 加入 PATH。
150+
151+
2. **PowerShell 无法激活 venv**
152+
- 可临时执行:
153+
```powershell
154+
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
155+
```
156+
157+
3. **Notebook 打开后缺包报错**
158+
- 在当前环境补装缺失包,例如:
159+
```bash
160+
pip install <package_name>
161+
```
162+
163+
4. **图形模型相关章节绘图失败**
164+
- 请确认本机已安装 Graphviz 程序,并将其加入系统 PATH。

_quarto.yml

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
project:
2+
type: website
3+
output-dir: docs
4+
5+
website:
6+
title: "因果推断:从概念到实践"
7+
description: "《Causal Inference for the Brave and True》中文翻译与示例站点。"
8+
repo-url: https://github.com/pumc-zhou/CausalInferenceIntro
9+
repo-actions: [source, issue]
10+
page-navigation: true
11+
navbar:
12+
pinned: true
13+
left:
14+
- href: index.qmd
15+
text: 首页
16+
right:
17+
- href: https://github.com/pumc-zhou/CausalInferenceIntro
18+
text: GitHub
19+
- href: https://github.com/matheusfacure/python-causality-handbook
20+
text: 原书
21+
sidebar:
22+
style: docked
23+
search: true
24+
collapse-level: 2
25+
contents:
26+
- section: "章节"
27+
contents:
28+
- href: chapters/01 第一章-因果关系入门.ipynb
29+
text: "第一章: 因果关系入门"
30+
- href: chapters/02 第二章-随机试验.ipynb
31+
text: "第二章: 随机试验"
32+
- href: chapters/03 第三章 统计学回顾:最危险的公式.ipynb
33+
text: "第三章: 统计学回顾"
34+
- href: chapters/04 第四章 图因果模型.ipynb
35+
text: "第四章: 图因果模型"
36+
- href: chapters/05 第五章 线性回归超乎寻常的有效性.ipynb
37+
text: "第五章: 线性回归的有效性"
38+
- href: chapters/06 第六章 分组和虚拟变量.ipynb
39+
text: "第六章: 分组和虚拟变量"
40+
- href: chapters/07 第七章 控制混淆因素之外的考虑.ipynb
41+
text: "第七章: 控制混淆之外"
42+
- href: chapters/08 第八章 工具变量.ipynb
43+
text: "第八章: 工具变量"
44+
- href: chapters/09 第九章 非服从性与局部平均效应.ipynb
45+
text: "第九章: 非服从性与 LATE"
46+
- href: chapters/10 第十章 匹配.ipynb
47+
text: "第十章: 匹配"
48+
- href: chapters/11 第十一章 倾向得分.ipynb
49+
text: "第十一章: 倾向得分"
50+
- href: chapters/12 第十二章 双重稳健估计.ipynb
51+
text: "第十二章: 双重稳健估计"
52+
- href: chapters/13 第十三章 面板数据与固定效应.ipynb
53+
text: "第十三章: 面板数据与固定效应"
54+
- href: chapters/14 第十四章 双重差分.ipynb
55+
text: "第十四章: 双重差分"
56+
- href: chapters/15 第十五章 合成控制.ipynb
57+
text: "第十五章: 合成控制"
58+
- href: chapters/16 第十六章 断点回归.ipynb
59+
text: "第十六章: 断点回归"
60+
- href: chapters/17 第十七章 预测模型 101.ipynb
61+
text: "第十七章: 预测模型 101"
62+
- href: chapters/18 第十八章 异质干预效应与个性化.ipynb
63+
text: "第十八章: 异质干预效应"
64+
- href: chapters/19 第十九章 评估因果模型.ipynb
65+
text: "第十九章: 评估因果模型"
66+
- href: chapters/20 第二十章 即插即用估计量.ipynb
67+
text: "第二十章: 即插即用估计量"
68+
- href: chapters/21 第二十一章 元学习器.ipynb
69+
text: "第二十一章: 元学习器"
70+
page-footer:
71+
left: "内容基于《Causal Inference for the Brave and True》中文翻译整理。"
72+
center: "Power by Quarto"
73+
right: "[GitHub 仓库](https://github.com/pumc-zhou/CausalInferenceIntro)"
74+
75+
format:
76+
html:
77+
theme: cosmo
78+
css: styles.css
79+
page-layout: article
80+
smooth-scroll: true
81+
toc: true
82+
toc-location: right
83+
toc-title: 本页目录
84+
toc-expand: 2
85+
toc-depth: 3
86+
code-copy: true
87+
anchor-sections: true
88+
link-external-newwindow: true
89+
grid:
90+
body-width: 980px
91+
sidebar-width: 300px
92+
margin-width: 220px
93+
lang: zh-CN
94+
95+
execute:
96+
freeze: auto
97+
98+
render:
99+
- index.qmd
100+
- chapters/*.ipynb
101+
- "!chapters/.ipynb_checkpoints/**"

chapters/01 第一章-因果关系入门.ipynb

Lines changed: 62 additions & 48 deletions
Large diffs are not rendered by default.

chapters/02 第二章-随机试验.ipynb

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,61 @@
44
"cell_type": "markdown",
55
"metadata": {},
66
"source": [
7-
"# 02 - 随机实验\n",
8-
"\n",
7+
"---\n",
8+
"title: \"第二章: 随机试验\"\n",
9+
"date: \"2026-03-02\"\n",
10+
"jupyter: python3\n",
11+
"author: \"CausalInferenceIntro\"\n",
12+
"lang: zh-CN\n",
13+
"execute:\n",
14+
" echo: true\n",
15+
" warning: false\n",
16+
"format:\n",
17+
" html:\n",
18+
" toc: true\n",
19+
" toc-depth: 3\n",
20+
" code-fold: false\n",
21+
"---\n"
22+
]
23+
},
24+
{
25+
"cell_type": "markdown",
26+
"metadata": {},
27+
"source": [
928
"## 黄金标准\n",
1029
"\n",
1130
"在上一节中,我们看到了关联关系与因果关系为什么不同。我们还看到了使关联成为因果关系所需的条件。\n",
1231
"\n",
13-
"$\n",
32+
"$$\n",
1433
"E[Y|T=1] - E[Y|T=0] = \\underbrace{E[Y_1 - Y_0|T=1]}_{ATT} + \\underbrace{\\{ E[Y_0|T=1] - E[Y_0|T=0] \\}}_{BIAS}\n",
15-
"$\n",
34+
"$$\n",
1635
"\n",
1736
"\n",
18-
"回顾一下,如果没有偏差,关联就会变成因果关系。如果 \\\\(E[Y_0|T=0]=E[Y_0|T=1]\\\\),就不会有偏差。换句话说,如果干预组和对照组相同或具有可比性,除了他们接受的干预外,关联将是因果关系。或者,用更专业的话说,当未处理的结果等于处理的反事实结果时。请记住,如果他们没有接受干预,这个反事实结果将是干预组的结果。\n",
37+
"回顾一下,如果没有偏差,关联就会变成因果关系。如果 $E[Y_0|T=0]=E[Y_0|T=1]$,就不会有偏差。换句话说,如果干预组和对照组相同或具有可比性,除了他们接受的干预外,关联将是因果关系。或者,用更专业的话说,当未处理的结果等于处理的反事实结果时。请记住,如果他们没有接受干预,这个反事实结果将是干预组的结果。\n",
1938
"\n",
2039
"我认为我们在使用数学解释如何使关联等于因果关系方面做得还不错。但这只是个理论。现在,我们来看看我们必须使偏差消失的第一个工具:**随机实验**。随机实验包括将群体中的个体随机分配到干预组或对照组。接受干预的比例不必是 50%。您可以进行一个实验,其中只有 10% 的样本得到处理。\n",
2140
"\n",
2241
"随机化通过使潜在结果独立于干预来消除偏见。\n",
2342
"\n",
24-
"$\n",
43+
"$$\n",
2544
"(Y_0, Y_1) \\perp\\!\\!\\!\\perp T\n",
26-
"$\n",
45+
"$$\n",
2746
"\n",
28-
"起初这可能会令人困惑(至少对我来说)。不过别担心,勇敢而真诚的伙伴,我会进一步解释的。如果结果与干预无关,这是否也意味着干预没有效果?嗯,是!但请注意,我不是在谈论结果。相反,我在谈论**潜在**结果。潜在的结果是在干预 (\\\\(Y_1\\\\)) 或控制 (\\\\(Y_0\\\\)) 下结果 **本来**会是怎样的。在随机试验中,我们**不**希望结果**独立**于干预,因为我们认为**干预会导致**结果。但我们希望**潜在**结果独立于干预。\n",
47+
"起初这可能会令人困惑(至少对我来说)。不过别担心,勇敢而真诚的伙伴,我会进一步解释的。如果结果与干预无关,这是否也意味着干预没有效果?嗯,是!但请注意,我不是在谈论结果。相反,我在谈论**潜在**结果。潜在的结果是在干预 ($Y_1$) 或控制 ($Y_0$) 下结果 **本来**会是怎样的。在随机试验中,我们**不**希望结果**独立**于干预,因为我们认为**干预会导致**结果。但我们希望**潜在**结果独立于干预。\n",
2948
"\n",
3049
"![img](./data/img/rct/indep.png)\n",
3150
"\n",
32-
"说潜在的结果独立于干预是说它们在预期中在干预组或对照组中是相同的。简单来说,这意味着干预组和对照组具有可比性。或者知道干预分配并没有给我任何关于干预前结果如何的信息。因此,\\\\((Y_0, Y_1)\\perp T\\\\) 意味着干预是唯一在干预和对照中产生结果差异的因素。要看到这一点,请注意独立性恰好意味着\n",
51+
"说潜在的结果独立于干预是说它们在预期中在干预组或对照组中是相同的。简单来说,这意味着干预组和对照组具有可比性。或者知道干预分配并没有给我任何关于干预前结果如何的信息。因此,$(Y_0, Y_1)\\perp T$ 意味着干预是唯一在干预和对照中产生结果差异的因素。要看到这一点,请注意独立性恰好意味着\n",
3352
"\n",
34-
"$\n",
53+
"$$\n",
3554
"E[Y_0|T=0]=E[Y_0|T=1]=E[Y_0]\n",
36-
"$\n",
55+
"$$\n",
3756
"\n",
3857
"正如我们所见,这使得\n",
3958
"\n",
40-
"$\n",
59+
"$$\n",
4160
"E[Y|T=1] - E[Y|T=0] = E[Y_1 - Y_0]=ATE\n",
42-
"$\n",
61+
"$$\n",
4362
"\n",
4463
"因此,随机化为我们提供了一种在干预和控制之间使用简单差异的方法,并将其称为干预效果。\n",
4564
"\n",
@@ -50,15 +69,15 @@
5069
"\n",
5170
"危机发生四个月后,许多人想知道引入的更改是否可以维持。毫无疑问,在线学习有其好处。这一次,它更便宜,因为它可以节省房地产和交通费用。它也可以更加数字化,利用来自世界各地的世界一流内容,而不仅仅是来自固定教师。尽管如此,我们仍然需要回答在线学习对学生的学习成绩是否有负面或正面影响。\n",
5271
"\n",
53-
"回答这个问题的一种方法是将主要提供在线课程的学校的学生与在传统课堂上授课的学校的学生进行比较。正如我们现在所知,这不是最好的方法。可能是在线学校只吸引纪律严明、成绩高于平均水平的学生,即使课堂表现出色。在这种情况下,我们将有一个正偏差,其中接受干预的学生在学业上比未接受干预的要好:\\\\(E[Y_0|T=1] > E[Y_0|T=0]\\\\)\n",
72+
"回答这个问题的一种方法是将主要提供在线课程的学校的学生与在传统课堂上授课的学校的学生进行比较。正如我们现在所知,这不是最好的方法。可能是在线学校只吸引纪律严明、成绩高于平均水平的学生,即使课堂表现出色。在这种情况下,我们将有一个正偏差,其中接受干预的学生在学业上比未接受干预的要好:$E[Y_0|T=1] > E[Y_0|T=0]$\n",
5473
"\n",
55-
"或者,另一方面,可能是在线课程更便宜,并且主要由不太富裕的学生组成,他们可能除了学习之外还需要工作。在这种情况下,这些学生即使参加了预科班,也会比预科学校的学生表现更差。如果是这种情况,我们就会偏向另一个方向,即接受干预的学生在学业上比未接受干预的学生更差:\\\\(E[Y_0|T=1] < E[Y_0|T=0]\\\\)\n",
74+
"或者,另一方面,可能是在线课程更便宜,并且主要由不太富裕的学生组成,他们可能除了学习之外还需要工作。在这种情况下,这些学生即使参加了预科班,也会比预科学校的学生表现更差。如果是这种情况,我们就会偏向另一个方向,即接受干预的学生在学业上比未接受干预的学生更差:$E[Y_0|T=1] < E[Y_0|T=0]$\n",
5675
"\n",
5776
"所以,虽然我们可以做简单的比较,但不会很有说服力。无论如何,我们永远无法确定是否有任何偏见潜伏并掩盖了我们的因果关系。\n",
5877
"\n",
5978
"![img](./data/img/rct/lurking_bias.png)\n",
6079
"\n",
61-
"为了解决这个问题,我们需要使处理过和未处理过的具有可比性 \\\\(E[Y_0|T=1] = E[Y_0|T=0]\\\\)。 强制执行此操作的一种方法是将在线课程和演示课程随机分配给学生。 如果我们设法做到这一点,除了他们接受的干预外,是否干预不同场景下的平均情况相同。\n",
80+
"为了解决这个问题,我们需要使处理过和未处理过的具有可比性 $E[Y_0|T=1] = E[Y_0|T=0]$。 强制执行此操作的一种方法是将在线课程和演示课程随机分配给学生。 如果我们设法做到这一点,除了他们接受的干预外,是否干预不同场景下的平均情况相同。\n",
6281
"\n",
6382
"幸运的是,一些经济学家已经为我们做到了这一点。 他们将班级随机化,这样一些学生被分配到面对面的讲座,其他人只进行在线讲座,而第三组则进行在线和面对面讲座的混合形式。 在学期末,他们收集了标准考试的数据。\n",
6483
"\n",
@@ -346,7 +365,7 @@
346365
"cell_type": "markdown",
347366
"metadata": {},
348367
"source": [
349-
"是的。就这么简单。我们可以看到面对面课程的平均得分为 78.54,而在线课程的平均得分为 73.63。对于在线学习的支持者来说,这不是个好消息。因此,在线课程的 \\\\(ATE\\\\) 为 -4.91。这意味着**在线课程会导致学生的平均成绩降低约 5 分**。就是这样。您不必担心在线课程可能有负担不起面对面课程的贫困学生,或者就此而言,您不必担心来自不同干预方法的学生在任何方面都有所不同他们接受的干预。根据设计,随机实验旨在消除这些差异。\n",
368+
"是的。就这么简单。我们可以看到面对面课程的平均得分为 78.54,而在线课程的平均得分为 73.63。对于在线学习的支持者来说,这不是个好消息。因此,在线课程的 $ATE$ 为 -4.91。这意味着**在线课程会导致学生的平均成绩降低约 5 分**。就是这样。您不必担心在线课程可能有负担不起面对面课程的贫困学生,或者就此而言,您不必担心来自不同干预方法的学生在任何方面都有所不同他们接受的干预。根据设计,随机实验旨在消除这些差异。\n",
350369
"\n",
351370
"出于这个原因,一个很好的健全性检查以查看随机化是否正确(或者您是否正在查看正确的数据)是检查干预前变量中的干预变量是否等于未干预变量。在我们的数据中,我们有关于性别和种族的信息,因此我们可以查看它们在不同群体中是否平等。对于 `gender`、`asian`、`hispanic` 和 `white` 变量,我们可以说它们看起来非常相似。然而,`black` 变量看起来有点不同。这引起了人们对小数据集会发生什么的关注。即使在随机化的情况下,也可能是偶然地,一组与另一组不同。在大样本中,这种差异趋于消失。\n",
352371
"\n",

0 commit comments

Comments
 (0)