【动手学因果推断】(二):潜在因果框架
【動手學因果推斷】(二):潛在因果框架
- 🌸個人主頁:JOJO數據科學
- 📝個人介紹:統計學top3高校統計學碩士在讀
- 💌如果文章對你有幫助,歡迎?關注、👍點贊、?收藏、👍訂閱專欄
- ?本文收錄于【動手學因果推斷】本系列主要記錄一些因果推斷學習筆記,以及如何應用常見的方法,并給出相關代碼,方便大家動手學習,后續會考慮做一些論文總結分析。
潛在因果框架
上一章我們從幾個例子介紹了因果推斷的一些基本概念,其中我們核心要解決的問題是測量因果效應。接下來我們將正式進入到因果推斷的問題研究中。
我們先來看一下一些基本概念
1.潛在結果和個體因果效應(ITE)
首先,潛在結果指的是一個干預后所有可能的結果,我們來考慮兩個場景
場景 1 考慮你不開心的場景。你正在考慮是否要養一只狗來幫助你快樂。如果你得到狗后變得快樂,是否意味著狗讓你快樂?好吧,如果你沒有養狗也會變得快樂怎么辦?在那種情況下,狗并不是讓你快樂所必需的,所以此時養狗對你的快樂有因果關系的說法是站不住腳的。
場景 2 讓我們稍微改變一下。考慮一下,如果你養了一只狗,你很開心,但現在,如果你不養狗,你會變得不開心。在這種情況下,養狗對你是否快樂有因果關系
在上述兩種情況下,我們都使用了稱為潛在結果概念。
結果Y表示是否快樂: Y = 1 對應于快樂,而 Y = 0 對應于不快樂。你的干預是你是否養狗: T = 1 對應你養狗而T= 0表示不養狗。
我們定義 Y ( 1 ) Y(1) Y(1)表示養狗的潛在結果, Y ( 0 ) Y(0) Y(0)表示不養狗的潛在結果,因此,場景1:
- Y(1) = 1,Y(0) = 1
- Y(1) = 1,Y(0) = 0
更一般地說,潛在結果Y(t) 表示接受干預后的結果會是什么。潛在結果不同于觀察到的結果Y,因為并非所有潛在結果都被觀察到。在實際中,我們往往只能觀察到一個潛在結果。
在我們剛剛的場景中,只有一個個體“你”, 我們定義個人因果效應(ITE):
在剛剛的例子中,場景二的ITE = Y(1)-Y(0) = 1-0=1
現在我們已經介紹了潛在的結果和ITE,我們可以介紹因果推理中出現的主要問題,這些問題在相關或預測的領域中是不存在的。
2. 因果推斷的基礎問題
核心問題: 我們不可能觀察到給定個體的所有潛在結果(missing data!)。
繼續考慮養狗的例子。我們無法同時觀察到 Y(1) 和 Y(0),除非你有一臺時間機器可以讓你回到過去并選擇第一次沒有養狗的版本。你不能簡單地得到一只狗,觀察 Y(1),把狗送走,然后觀察 Y(0),因為第二次觀察將受到你在兩次觀察之間采取的所有行動以及自第一次觀察以來發生的任何其他變化的影響觀察。
進一步的,因為如果我們不能同時觀察到 Y(1) 和 Y(0),那么我們就無法觀察到 Y(1) ? Y(0) 的因果效應。 這個問題是因果推理所獨有的,因為在因果推理中,我們關心的是做出因果推斷,而這些推斷是根據潛在結果來定義的。相比之下,考慮機器學習。在機器學習中,我們往往只關心預測觀察到的結果Y,所以不需要潛在的結果,這意味著機器學習不必處理我們在因果推理中必須處理的這個基本問題。
我們稱不能觀察到的潛在結果為反事實,因為它們與事實結果相反。 觀測到的潛在結果被稱為事實結果。我們來看下面這個表:
對于每一個個體,我們給予不同的干預 T T T,會得到不同的潛在結果 Y ( t ) Y(t) Y(t),但是要么只能得到Y(1),要么只能得到Y(0),其中?都是我們無法直接得到的。因此這就是我們要解決的問題,處理這些缺失數據
思考 我如何去合理的估算反事實結果,以便于我們因果效應呢?
首先,研究一個個體 Y i ( t ) Y_i(t) Yi?(t)可能不是那么有意義,因為這是一個隨機變量,我們真正感興趣的是平均干預效應(Average treatment effect,ATE) A T E = E [ Y ( 1 ) ? Y ( 0 ) ] ATE = E[Y(1)-Y(0)] ATE=E[Y(1)?Y(0)]。由期望的線性性質,問題的核心就轉化為求 E [ Y ( 1 ) ] ? E [ Y ( 0 ) ] E[Y(1)]-E[Y(0)] E[Y(1)]?E[Y(0)]。理想情況下,如果我們能夠用不同T取值的條件期望來計算,如下圖所示,那就解決了我們的問題,但是,很多情況下,這個等號是不成立的
E [ Y ( 1 ) ] ? E [ Y ( 0 ) ] E[Y(1)]-E[Y(0)] E[Y(1)]?E[Y(0)]:描述的是因果關系
E [ Y ∣ T = 1 ] ? E [ Y ∣ T = 0 ] E[Y|T=1]-E[Y|T=0] E[Y∣T=1]?E[Y∣T=0]:描述的是相關關系。
這兩者是不等價的,我們上一篇文章舉例解釋了相關不等于因果。我們再來看一個例子
我們發現穿鞋睡覺與醒來頭痛密切相關,但這兩者之間沒有因果關系
常見原因:前一天晚上喝酒,所以忘記拖鞋,而喝酒又會造成頭疼,因此此時是存在Confounding(混淆)變量X(喝酒),它同時造成了穿鞋睡覺和頭疼。
還有一種情況是穿鞋睡覺和不穿鞋睡覺的群體是不可比的(樣本選擇偏差)
我們可以看到,穿鞋睡覺的人大部分是喝醉的,而不穿鞋睡覺的大部分是清醒的,此時樣本分布是不一樣的,存在選擇偏差
那什么時候的可比的呢?
假設穿鞋睡覺和不穿鞋睡覺人群清醒和喝醉的分布是一致的,那么此時就是可比的
接下來我們看一下,在什么假設下,相關和因果是可以劃等號的呢?
3. 基本假設
3.1 (Ignorability / Exchangeability)
這個假設是因果推斷的關鍵,因為它允許我們將 ATE退到研究相關差異上。有了這個條件,我們可以計算各個那個例子的因果效應
ignorability:我們可以理解為可以忽略掉混淆變量:在這里就是忽略掉X對T的影響,因此此時不存在confounding(混淆)
從Exchangeability角度來看,交換不同的條件干預,我們的期望是一樣的,此時暗示中不同組之間的分布是一致的,不存在樣本選擇偏差。
因此,這個條件和ignorability是等價的
3.2 Identifiability(可定義的)
Identifiability:我們能夠從一個統計學變量中計算因果效應
如果我們能夠將因果效應轉換到一個統計學變量中,那么我們可以研究它的分布,概率等,進而運用一系列統計方法。
因此,我們在因果推斷中,感興趣都是Identifiability的,這樣我們才可以用相關性的方法來研究。
3.3 No interference(無干擾性)
無干擾性:樣本i的潛在結果不受其它樣本的影響
例如Y代表我是否開心,T表示我是否養狗,那么Y只取決于我是否養狗,而不受其他人是否養狗的影響。
3.4 Consistency(一致性)
當T=t, Y = Y ( t ) Y=Y(t) Y=Y(t),也就是說只有T一樣,我們的Y一定也是一樣的,否則違背了一致性。例如,假設我養的是金毛,我開心,而我養的柴犬,我不開心,這樣就違背了一致性,我們應該要確保無論養什么品種的狗,他們的結果應該是一致的。
3.5 Conditional exchangeability(條件可交換)
首先,我們先引出一個新的概念:條件平均因果效應(CATE)
C A T E = E [ Y ( 1 ) ∣ X ] ? E [ Y ( 0 ) ∣ X ] CATE = E[Y(1)|X]-E[Y(0)|X] CATE=E[Y(1)∣X]?E[Y(0)∣X]
此時計算的是在給定一個協變量X的條件下,平均因果效應,和之前一樣,我們也需要相應的假設
conditional exchangeability:在給定協變量X的條件下Y與T的獨立的
我們剛剛定義的可交換是直接說Y和T獨立,忽略X與T之間的關系,那么這里的條件可交換是指在給定X的條件下X和T之間沒有關系
注意:條件和獨立條件之間沒有關系
因此,在滿足條件可交換時,我們有以下推導
根據重期望公式,我們可以根據CATE得到ATE:
3.6 Positivity(正向性)
雖然以許多協變量為條件對于實現無混淆很有用,但它實際上可能會帶來一些問題。因為沒有考慮positivity(正向性)這個條件,正向性是指具有不同協變量的所有數據組都有一定概率接受任何干預的條件。形式上,我們定義二元干預的正向性如下:
為什么需要正向性條件呢?
我們來看求ATE的公式如下
接下來利用期望的定義:
根據貝葉斯公式:
現在可以看到,我們的分母存在 P ( T = 1 ∣ X = x ) P(T=1|X=x) P(T=1∣X=x),因此要保證它是正值。這就是為什么我們需要正向性假設的數學原理。
直覺上怎么理解呢?
如果違反了正向性假設,那就意味著在數據的某個子組中,每個人總是接受干預或每個人總是接受控制。能夠估計該組中實驗與對照組的因果關系是沒有意義的,因為我們只看到實驗或對照組,無法對比。
正向性的另一個名稱是重疊(overlap)。這個名字的直覺是我們希望實驗組的協變量分布與對照組的協變量分布重疊。
我們可以發現Positivity和unconfoundness存在trade-off的關系
3.7 總結
我們首先引入了無混淆性(條件可交換性),因為它是主要的因果假設。然而,所有的假設都是必要的
- Identifiability (Assumption 2.2)
- No interference (Assumption 2.3)
- Consistency (Assumption 2.4)
- Positivity (Assumption 2.6)
現在我們結合上述的條件,可以將一個因果量轉換為統計量
4.因果估計量
為了方便后續相關描述,我們給出幾個概念
- estimand: 估計量
- estimate:估計
- estimation:估計過程
其中,我們定義causal estimand為因果估計量,例如 E [ Y ( 1 ) ] ? E [ Y ( 0 ) ] E[Y(1)]-E[Y(0)] E[Y(1)]?E[Y(0)]就是一個因果估計量,statistic estimand為統計估計量,例如 E [ Y ∣ T = 1 ] ? E [ ( Y ∣ T = 1 ) ] E[Y|T=1]-E[(Y|T=1)] E[Y∣T=1]?E[(Y∣T=1)]是一個統計估計量,我們需要做的是去估計這些統計估計量,然后得到我們的因果關系。
具體怎么估計統計估計量,我們可以運用統計學、機器學習等方法,下面我們來看一個簡單的例子
5.實際案例:鈉攝入量對血壓的影響
這是一個重要的應用,因為發現大約 46% 的美國人患有高血壓,而高血壓與死亡率有關,如果我們能夠發現鈉的攝入量與血壓是有因果關系的,那么我們就可以控制鈉攝入量,實現血壓的控制
- Y:血壓
- T:T=1表示鈉攝入量高于3.5g,T=0表示鈉攝入量低于3.5g
- X:協變量,包含年齡和尿液蛋白質含量
現在,我們如何估計ATE呢?,首先,我們假設滿足consistency,positivity,條件可交換。然后,我們可以得到ATE:
E X [ E [ Y ∣ T = 1 , X ] ? E [ Y ∣ T = 0 , X ] ] E_X[E[Y|T=1,X]-E[Y|T=0,X]] EX?[E[Y∣T=1,X]?E[Y∣T=0,X]]
然后,我們將對X的外部期望替換為對數據的平均值,得到以下結果
如何估計內部的條件期望呢?這里有很多機器學習或統計方法應用,我們在這里介紹簡單的線性回歸。下面來看具體代碼和結果
5.1代碼
import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression# 數據生成 def generate_data(n=1000, seed=0, beta1=1.05, alpha1=0.4, alpha2=0.3, binary_treatment=True, binary_cutoff=3.5):np.random.seed(seed)age = np.random.normal(65, 5, n)sodium = age / 18 + np.random.normal(size=n)if binary_treatment:if binary_cutoff is None:binary_cutoff = sodium.mean()sodium = (sodium > binary_cutoff).astype(int)blood_pressure = beta1 * sodium + 2 * age + np.random.normal(size=n)proteinuria = alpha1 * sodium + alpha2 * blood_pressure + np.random.normal(size=n)hypertension = (blood_pressure >= 140).astype(int) # not used, but could be used for binary outcomesreturn pd.DataFrame({'blood_pressure': blood_pressure, 'sodium': sodium,'age': age, 'proteinuria': proteinuria}) df = generate_data() df.head()| 0 | 147.157602 | 1 | 73.820262 | 46.140554 |
| 1 | 133.339602 | 1 | 67.000786 | 40.970603 |
| 2 | 139.833515 | 0 | 69.893690 | 41.835567 |
| 3 | 152.500558 | 1 | 76.204466 | 46.401798 |
| 4 | 149.644768 | 1 | 74.337790 | 44.082575 |
因為這里我們使用的是模擬數據集,我們知道,在這里真實的sodium的效應是1.05
# 計算因果效應 def estimate_causal_effect(Xt, y, model=LinearRegression(), treatment_idx=0):model.fit(Xt, y)Xt1 = pd.DataFrame.copy(Xt)Xt1[Xt.columns[treatment_idx]] = 1Xt0 = pd.DataFrame.copy(Xt)Xt0[Xt.columns[treatment_idx]] = 0return (model.predict(Xt1) - model.predict(Xt0)).mean()X t X_t Xt?是你要輸入的干預變量和協變量,y是我們的目標變量。
不加入協變量
不加入協變量我們就只考慮
E [ Y ∣ T = 1 ] ? E [ Y ∣ T = 0 ] E[Y|T=1]-E[Y|T=0] E[Y∣T=1]?E[Y∣T=0]
計算的結果為4.9,和目標的1.05差距很大 ( 4.9 ? 1.05 ) / 1.05 = 368.87 % (4.9-1.05)/1.05 =368.87\% (4.9?1.05)/1.05=368.87%.因為我們知道真實的Y還受到X的影響,這個時候直接計算Y對T的條件期望誤差是較大的
加入協變量
此時我們要計算的就是
E X [ E [ Y ∣ T = 1 , X ] ? E [ Y ∣ T = 0 , X ] ] E_X[E[Y|T=1,X]-E[Y|T=0,X]] EX?[E[Y∣T=1,X]?E[Y∣T=0,X]]
計算的結果為0.93,和目標的1.05差距較小 ∣ 0.93 ? 1.05 ∣ / 1.05 = 11.42 % |0.93-1.05|/1.05 =11.42\% ∣0.93?1.05∣/1.05=11.42%。這一部分誤差我們可以認為是隨機誤差,增大樣本量可以減少
總結
我們介紹了潛在結果框架,其中因果推斷的核心問題:不能觀察到所有的潛在結果,導致我們無法衡量因果效應:ATE 和 CATE
解決方法:將因果估計量退到統計估計量來研究,進而可以應用一系列的統計學和機器學習方法。因此,我們引出了一系列假設,來確保這樣做是合理的。
最后我們通過一個模擬數據集,展示了如何計算因果效應,以及是否使用協變量是有較大差異的。
改進: 最后我們使用的是線性回歸來估計條件期望, Y = α T + β X Y=\alpha T+\beta X Y=αT+βX,可以看出,不同的X我們的 α \alpha α都是一樣的,因此無法捕捉到不同X條件下干預T的異質性,可以考慮使用一些更復雜的非線性模型,后續在進行相關討論。此外,我們這些假設條件很多情況下可能不成立,那我們該如何進行研究?大家可以思考一下這些問題并進行改進。
總結
以上是生活随笔為你收集整理的【动手学因果推断】(二):潜在因果框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 OneNote 无法正常同步 问题
- 下一篇: rtems网络移植-rtems系统初始化