因果推理
因果推理是指通过观察、实验或分析数据来确定某一事件或现象(因)对另一事件或现象(果)的影响关系的过程。因果推理不仅关注事件之间的相关性,还强调因果关系的方向性和机制。
在因果推理中,通常需要考虑以下几个重要概念:
因果关系:这是因果推理的核心,指的是一个变量(因)如何影响另一个变量(果)。
相关性:因果推理常常需要分析变量之间的相关性,但相关性并不意味着因果关系。因果推理需要进一步的分析以确定真正的因果关系。
控制变量:为了更准确地识别因果关系,研究者通常需要控制其他可能影响因果关系的变量,以排除混杂因素的干扰。
实验设计:通过随机对照实验(RCT)等设计,研究者可以更强有力地支持因果推理。实验可以帮助确保观察到的效果是因而非其他因素造成的。
因果图和模型:使用因果图和统计模型(如结构方程模型)可以帮助更清晰地描绘和测试因果关系。
辛普森悖论
辛普森悖论(Simpson’s Paradox)是一个统计学现象,指的是在某个数据集中,当对不同子组进行分析时可能得出一个结果,但当将所有数据合并在一起分析时,结果却可能完全相反。
这个悖论显示了数据分析中的潜在陷阱,尤其是在未考虑潜在混杂因素的情况下。在辛普森悖论中,某一变量的关系在不同的子组中可能显示出一种趋势,但在整体数据中却表现出相反的趋势。这通常发生在不同子组之间存在着显著差异或不平衡时。
下面通过几个简单的例子来展示。
锻炼与胆固醇
锻炼与胆固醇含量之间的关系是复杂的,可能因年龄等因素而反转。整体数据中看似存在正相关,但分组后可能会发现负相关。这是由于年龄会同时影响锻炼量和胆固醇,而我们如果需要判断锻炼量是否和胆固醇之间有直接的因果关系,就需要施加干预(do)。单纯的计算各个年龄层的条件概率仍不能排除其他外生干扰,只有施加强制干预才能明确的排除年龄的影响。
定义:干预通常用符号 表示,意味着强制将变量 的值设置为 ,而不管 的自然值是什么。
平行世界:干预的概念与“平行世界”的思想紧密相关。在没有干预的情况下,我们观察到的是变量的自然状态。而干预则是想象在另一个平行世界中,我们强制改变了某些变量的值,然后观察结果。
内生性问题:在自然观察中,变量之间的关系可能受到内生性问题的影响,即变量之间存在未观测到的共同原因。干预通过人为改变变量的值,可以帮助我们绕过这些内生性问题,从而更清晰地看到变量之间的因果关系。
随机化试验:在实验设计中,干预通常通过随机化试验来实现。例如,在医学研究中,研究者可能会随机分配病人接受治疗或安慰剂,以评估治疗的效果。
do算子:在因果推断的数学框架中,do算子是处理干预的数学工具。它允许我们明确地表达干预,并在概率模型中计算干预下的期望结果。
因果效应:干预的目的是估计因果效应,即一个变量的改变对另一个变量的平均影响。例如,估计治疗对疾病恢复的影响。
反事实推理:干预也与反事实推理相关,即考虑“如果…会怎样?”的问题。例如,“如果病人接受了治疗,他们的恢复情况会怎样?”
“ACE”通常指的是”Average Causal Effect”,即平均因果效应。它用来描述在所有个体上,处理或干预(例如,接受某种治疗、参与某个项目、或受到某种政策影响)与结果(例如,健康状况、考试成绩、经济收入)之间平均的因果关系强度。
具体来说,如果我们用 表示个体接受处理后的潜在结果,用 表示个体不接受处理的潜在结果,那么ACE可以定义为:
这里 表示期望值,即对所有个体的平均。ACE可以告诉我们,如果将接受处理的情况与不接受处理的情况相比较,个体的平均结果会有多大差异。
药物治愈率
[1] "男性"
未治愈 治愈 治愈率
用药 6 81 93.1%
不用药 36 234 86.7%
[1] "女性"
未治愈 治愈 治愈率
用药 71 192 73.0%
不用药 25 55 68.8%
[1] "整体"
未治愈 治愈 治愈率
用药 77 273 78.0%
不用药 61 289 82.6%
在每个分组中用药的治愈率都高于不用,但是整体中用药的治愈率却低于不用药的
根据全概率公式P(Y=1|Z=1) = P(Y=1|Z=1,X=1)P(X=1|Z=1) + P(Y=1|Z=1,X=0)P(X=0|Z=1)这里Y为是否治愈,Z为是否吃药,X为性别,可以看出来,吃药的性别比例会影响到最终的结果,因为性别会影响到药效
一般流程
因果分析一般包括以下流程
指定因果问题
使用因果图绘制我们的假设
对我们的假设进行建模
诊断我们的模型
估计因果效应
对效果估计进行敏感性分析
下面用一个简单的例子来介绍整个流程
指定因果问题
使用蚊帐会降低患疟疾的风险吗?我们可以从 causalworkshop
包中找到 net_data
中的模拟数据
net 和 net_num:net 是一个二进制变量,用来表示参与者是否使用了蚊帐,1 表示使用了,0 表示没有使用
疟疾风险等级 (malaria_risk):一个从 0 到 100 的量表,用来衡量疟疾的风险程度。
每周收入 (income):以美元为单位,用来表示参与者每周的收入。
健康评分 (health):一个从 0 到 100 的量表,用来衡量参与者的健康状态。
家庭居住人数 (household):指在一个家庭中居住的人数。
免费蚊帐计划资格 (eligible):一个二进制变量,用来表示家庭是否有资格获得免费蚊帐计划,1 表示有资格,0 表示没有资格。
夜间平均气温 (temperature):以摄氏度为单位,用来表示夜间的平均气温。
蚊子抗药性 (resistance):一个从 0 到 100 的量表,用来衡量当地蚊子对杀虫剂的抗药性,数值越高表示抗药性越强。
代码
library(tidyverse)
library(causalworkshop)
glimpse(net_data)
Rows: 1,752
Columns: 10
$ id <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, …
$ net <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE…
$ net_num <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,…
$ malaria_risk <dbl> 38, 48, 32, 55, 36, 30, 29, 45, 51, 42, 60, 50,…
$ income <dbl> 779, 700, 1083, 753, 919, 969, 1012, 708, 733, …
$ health <dbl> 35, 35, 58, 68, 46, 37, 58, 30, 18, 64, 30, 20,…
$ household <dbl> 1, 3, 3, 3, 5, 3, 1, 2, 3, 3, 4, 3, 2, 5, 2, 4,…
$ eligible <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE…
$ temperature <dbl> 18.3, 18.6, 24.2, 19.1, 21.2, 20.2, 18.9, 28.8,…
$ insecticide_resistance <dbl> 38, 40, 70, 57, 59, 49, 52, 42, 66, 45, 78, 58,…
代码
library(tidyverse)
library(causalworkshop)
<- net_data |>
p ggplot(aes(malaria_risk, fill = net)) +
geom_density(color = NA, alpha = .8)
ggplotly(p)
代码
|>
net_data group_by(net) |>
summarize(malaria_risk = mean(malaria_risk))
# A tibble: 2 × 2
net malaria_risk
<lgl> <dbl>
1 FALSE 43.9
2 TRUE 27.5
代码
library(broom)
|>
net_data lm(malaria_risk ~ net, data = _) |>
tidy()
# A tibble: 2 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 43.9 0.377 116. 0
2 netTRUE -16.4 0.741 -22.1 1.10e-95
通过密度图、描述性统计及lm模型,我们都可以看出使用蚊帐可能可以预防疟疾
因果效应的均值(Average Treatment Effect, ATE)是指在某个特定的研究或实验中,对照组和实验组之间因施加某种处理或干预(如药物、政策、干预措施等)所产生的平均效应。简而言之,它衡量的是施加处理后,个体的平均结果相比于未施加处理的结果的变化。
数学上,如果我们用 Y(1)表示接受处理的个体结果,Y(0) 表示未接受处理的个体结果,那么因果效应的均值可以表示为:
其中,E[Y(1)]是接受处理个体结果的期望值,E[Y(0)] 是未接受处理个体结果的期望值。