因果推斷與中介效應

郝hai發表於2024-10-07

因果推斷(Causal Inference)是統計學和資料科學中的重要分支,用於理解事件之間的因果關係,而不僅僅是相關性。與相關性分析不同,因果推斷追求揭示因變數(結果)如何受到自變數(原因)的直接或間接影響。特別是,因果推斷為科學研究、政策制定和商業決策提供了至關重要的工具。隨著資料科學的快速發展,因果推斷的應用範圍也越來越廣泛,從公共健康、經濟學到社交網路分析,都開始深度應用該領域的理論和方法。這裡將圍繞因果推斷的發展歷程、主要理論框架以及其在直接效應和間接效應分析中的應用展開討論,探討因果推斷如何幫助我們理解複雜的社會和自然現象。

因果推斷與中介效應

一、因果推斷的發展歷程

  • 早期的哲學基礎
    因果關係的研究可以追溯到古希臘時期的哲學家。亞里士多德提出了“四因說”,即形式因、質料因、動力因和目的因,試圖從不同角度理解事件發生的原因。近代哲學家如休謨(David Hume)則進一步提出,因果關係是我們心靈中觀念的聯想,並非直接從感官經驗中得出,因此他認為因果關係是經驗上的規律,而非必然性。這些哲學探討為現代因果推斷的理論奠定了思考的基礎。

  • 統計學視角的因果推斷
    20世紀初,隨著統計學的興起,研究者開始嘗試用資料來定量化因果關係。皮爾遜(Karl Pearson)是相關性分析的奠基者,但他堅信因果關係無法透過統計分析直接推匯出。而費舍爾(Ronald A. Fisher)則透過引入隨機化實驗設計,提供了直接揭示因果關係的實證方法。這種方法透過隨機化控制實驗(RCT)避免了因果混淆因素,從而為因果推斷打下了堅實的基礎。

  • 貝葉斯網路與結構因果模型(SCM)
    進入20世紀末,裴霖(Judea Pearl)透過貝葉斯網路和結構因果模型(Structural Causal Models,SCM)的提出,進一步推動了因果推斷的現代化發展。他提出了因果推斷的數學框架,利用圖模型來描述變數之間的因果結構,並且透過“干預”操作來模擬現實中改變變數的方法。透過這一框架,研究者不僅可以估計變數之間的關聯,還能推斷在不同的干預措施下,結果變數如何變化。這一發展使得因果推斷理論得到廣泛應用,特別是在非實驗資料的因果分析上取得了重要突破。

二、因果推斷概述

2.1 因果推斷的基本理論框架

  • 因果圖模型
    因果推斷的重要工具之一是因果圖模型(Causal Diagram)。透過有向無環圖(DAGs),研究者可以直觀地展示變數之間的因果結構。例如,節點代表變數,箭頭代表因果關係。透過這種方式,可以識別出直接影響和潛在的混淆因素,從而制定更為準確的因果推斷策略。
  • 反事實框架
    反事實框架(Counterfactual Framework)是因果推斷的核心理念之一。反事實分析要求研究者思考:“如果沒有發生某個事件,會發生什麼?”這一框架幫助我們理解因果關係的本質。例如,在醫學研究中,研究者可能會問:“如果一個病人沒有接受治療,他們的健康狀況會如何變化?”透過這種思維方式,反事實框架可以量化治療效果或其他干預措施的因果效應。
  • “干預”與“控制”
    在因果推斷中,常常涉及到“干預”(Intervention)和“控制”(Control)這兩個重要概念。干預意味著對某個自變數進行人為操控,控制則是為了排除混淆因素的影響。在現實中,控制的難度往往較大,因為許多因素難以直接觀測或排除。結構因果模型透過圖結構的分析,能夠幫助識別哪些因素可以透過統計手段進行控制,從而提供合理的因果推斷。

2.2 直接效應與間接效應

  • 直接效應的定義
    直接效應(Direct Effect)指的是自變數對因變數的直接影響,而不透過任何中介變數。例如,在研究吸菸與肺癌之間的關係時,直接效應可以理解為吸菸對肺癌的直接因果影響,而不考慮其他潛在因素(如基因或環境)的影響。
  • 間接效應的定義
    間接效應(Indirect Effect)則涉及中介變數的參與。在因果鏈條中,自變數首先影響中介變數,然後中介變數再影響因變數。例如,吸菸不僅直接影響肺癌的發病率,還可能透過影響呼吸系統功能這一中介因素間接作用於肺癌風險。間接效應的分析對於理解複雜系統中的多層次因果關係非常重要。
  • 總效應的分解
    因果推斷的一個重要任務是將總效應分解為直接效應和間接效應。總效應是指自變數對因變數的總影響,它可以透過直接效應和間接效應的累積來解釋。分解總效應能夠幫助我們更清楚地瞭解系統中的因果機制,從而為有效干預提供指導。例如,在制定公共健康政策時,瞭解行為(如吸菸)透過多種途徑(直接和間接)影響健康的方式,可以幫助決策者設計出針對不同方面的綜合干預措施。

2.3 因果推斷的實際應用

  • 公共健康中的應用
    因果推斷在公共健康領域的應用尤為廣泛,特別是在流行病學研究中。透過因果推斷,研究者可以識別出潛在的疾病傳播因素,並提出針對性的干預措施。例如,愛滋病、癌症、糖尿病等疾病的發病機制往往涉及多種因素的相互作用,因果推斷可以幫助研究者理解不同風險因素如何透過複雜的機制共同作用,從而提出有效的防控措施。
  • 社會科學中的應用
    在社會科學研究中,因果推斷也被廣泛應用於政策分析、社會行為研究等領域。例如,研究者可以透過因果推斷方法評估某項教育政策的實施對學生成績的影響。這類研究不僅有助於揭示政策的有效性,還能識別出政策中潛在的中介機制,從而為政策最佳化提供理論依據。
  • 經濟學中的應用
    因果推斷在經濟學中應用廣泛,特別是在評估經濟政策效果時。例如,透過分析一項稅收政策對消費和投資行為的影響,經濟學家可以分解出直接效應(如稅收變化對企業支出的直接影響)和間接效應(如稅收變化透過影響市場預期進一步影響經濟活動)。這些分析為經濟政策的制定和評估提供了量化的依據。
  • 人工智慧和機器學習中的應用
    因果推斷在人工智慧和機器學習中的應用近年來也受到廣泛關注。傳統的機器學習演算法往往只關注關聯關係,而忽視因果關係。然而,隨著智慧系統在醫療、金融等領域的應用越來越廣泛,理解演算法背後的因果機制變得尤為重要。例如,在自動化決策系統中,因果推斷可以幫助我們設計更具魯棒性的模型,避免因關聯性誤判而導致錯誤決策。

三、因果推斷的模型

因果推斷常使用線性迴歸模型來表徵因變數 \(Y\) 與自變數 \(X\) 的關係。如果存在中介變數 \(M\),可以透過分解總效應為直接效應和間接效應來構建因果關係。

因果推斷與中介效應

3.1 基本模型

總效應模型

\[Y = cX + e_1 \quad \text{(總效應)} \]

其中,\(c\)\(X\)\(Y\) 的總效應,\(e_1\) 是誤差項。

中介變數模型

如果 \(M\) 是中介變數,因果路徑會經過兩步,模型則變為:

\[M = aX + e_2 \quad \text{(X 對 M 的影響)} \]

\[Y = bM + c'X + e_3 \quad \text{(M 和 X 對 Y 的影響)} \]

其中,\(a\)\(X\)\(M\) 的效應,\(b\)\(M\)\(Y\) 的效應,\(c'\) 是控制了 \(M\)\(X\)\(Y\) 的直接效應。
此時,間接效應由 \(a \times b\) 給出,總效應可分解為:

\[c = c' + ab \]

這裡 \(ab\) 表示間接效應,而 \(c'\) 表示直接效應。

反事實模型

另一種常用的模型是反事實框架,該框架透過定義實際結果 \(Y_x\) 和反事實結果 \(Y_{x'}\) 來量化因果效應。干預後的因果效應表示為:

平均處理效應 (ATE)

\[\text{ATE (Average Treatment Effect)} = \mathbb{E}[Y_x - Y_{x'}] \]

ATE 衡量的是處理組和對照組之間的平均效應差。

因果效應的檢驗方法

逐步檢驗法(Baron & Kenny)
逐步檢驗法是經典的中介效應分析方法,主要步驟如下:

  • 第一步:透過迴歸分析檢驗 \(X\)\(Y\) 的總效應 \(c\) 是否顯著。
  • 第二步:檢驗 \(X\) 對中介變數 \(M\) 的效應 \(a\) 是否顯著。
  • 第三步:檢驗 \(M\)\(Y\) 的效應 \(b\) 是否顯著,且檢驗 \(X\) 在控制了 \(M\) 後對 \(Y\) 的直接效應 \(c'\) 是否顯著。如果 \(a\)\(b\) 顯著且 \(c'\) 不顯著,則存在完全中介效應;如果 \(c'\) 仍然顯著,則是部分中介效應。

Sobel 檢驗
Sobel 檢驗用於直接檢驗間接效應是否顯著,其檢驗統計量為:

\[z = \frac{ab}{\sqrt{b^2 \cdot s_a^2 + a^2 \cdot s_b^2}} \]

其中 \(s_a\)\(s_b\) 分別是 \(a\)\(b\) 的標準誤。如果 \(z\) 值顯著,間接效應被認為顯著。

Bootstrap 法
Bootstrap 法成為檢驗中介效應的流行方法,因其對非正態分佈資料也有較好的表現。具體步驟是從原始樣本中重複抽樣,並對每個樣本計算間接效應 \(ab\)。透過計算間接效應的置信區間,判斷間接效應是否顯著。如果置信區間不包含 0,則間接效應顯著。

貝葉斯方法(MCMC)
貝葉斯方法如馬爾科夫鏈蒙特卡洛(MCMC)可用於複雜的中介效應模型檢驗,特別是在小樣本下的情況下更具優勢。透過設定先驗分佈並透過模擬得到後驗分佈來估計因果效應。

3.2 透過資料檢驗因果推斷

  • 資料準備與模型構建
    在資料檢驗中,首先要保證資料質量,確保自變數、因變數和中介變數的資料完整且符合模型假設。常見的資料處理步驟包括標準化、處理缺失資料等。接著根據理論假設,建立相應的模型結構。
  • 迴歸分析
    利用迴歸模型估計總效應、直接效應和間接效應。透過逐步迴歸檢驗模型各項係數的顯著性,可以判斷中介效應的存在及其程度。
  • Bootstrap 置信區間估計
    為了更準確地檢驗間接效應,可以使用 Bootstrap 法生成大量的模擬樣本,從每個樣本中計算間接效應 \(ab\),並得到其分佈。透過置信區間估計,判斷間接效應是否顯著。
  • 假設檢驗
    針對直接效應和間接效應,採用 Sobel 或 Bootstrap 方法進行顯著性檢驗。對於小樣本資料,可以考慮採用貝葉斯方法進行估計,特別是在先驗知識豐富的情況下。

因果推斷提供了多種數學工具來量化變數間的因果關係,特別是在直接效應和間接效應的分解上具有重要應用。透過線性迴歸、Sobel 檢驗、Bootstrap 方法等多種手段,可以從資料中得出可靠的因果效應估計,並透過科學的假設檢驗驗證其顯著性。在大資料和機器學習的背景下,因果推斷方法將繼續在各個領域發揮關鍵作用。

四、案例分析

構造適合上述因果模型的資料。假設自變數 \(X\) 是教育水平(以年數為單位),因變數 \(Y\) 是年收入(以美元為單位),中介變數 \(M\) 是工作經驗年數。

資料構造

假設我們有以下關係:

  • 教育水平 \(X\) 會影響工作經驗 \(M\),即更多的教育可能導致更多工作經驗。
  • 工作經驗 \(M\) 和教育水平 \(X\) 都會影響年收入 \(Y\)

具體的資料生成模型可以如下設定:

  • \(M = 2X + \epsilon_2\),其中 \(\epsilon_2\) 是正態分佈誤差項,代表隨機因素的影響。
  • \(Y = 3M + 1.5X + \epsilon_3\),其中 \(\epsilon_3\) 是另一個正態分佈誤差項,表示其他未觀察到的因素的影響。

檢驗步驟

我們將使用逐步迴歸分析來驗證直接效應、間接效應和總效應的顯著性。此外,我們將透過 Sobel 檢驗和 Bootstrap 方法來進一步檢驗中介效應。

逐步迴歸分析

  • 第一步:檢驗 \(X\)\(Y\) 的總效應 \(c\) 是否顯著。
  • 第二步:檢驗 \(X\) 對中介變數 \(M\) 的效應 \(a\) 是否顯著。
  • 第三步:檢驗 \(M\)\(Y\) 的效應 \(b\) 是否顯著,且檢驗 \(X\) 在控制了 \(M\) 後對 \(Y\) 的直接效應 \(c'\) 是否顯著。

Sobel 檢驗
Sobel 檢驗用於直接檢驗間接效應 \(a \times b\) 是否顯著,其檢驗統計量為:

\[z = \frac{ab}{\sqrt{b^2 \cdot s_a^2 + a^2 \cdot s_b^2}} \]

其中 \(s_a\)\(s_b\) 分別是 \(a\)\(b\) 的標準誤。如果 \(z\) 值顯著,間接效應被認為顯著。

Bootstrap 方法

Bootstrap 方法透過從原始樣本中重複抽樣,並對每個樣本計算間接效應 \(a \times b\)。透過計算間接效應的置信區間,判斷間接效應是否顯著。如果置信區間不包含 0,則間接效應顯著。透過這些步驟,我們可以驗證教育水平對年收入的直接效應和透過工作經驗的間接效應,從而得出教育水平如何影響年收入的結論。


import numpy as np
import pandas as pd
import statsmodels.api as sm
from sklearn.utils import resample
from scipy import stats

# 資料生成
np.random.seed(42)
n = 500  # 樣本數
X = np.random.normal(12, 2, n)  # 自變數 教育年限
e2 = np.random.normal(0, 1, n)  # 誤差項 e2
M = 2 * X + e2  # 中介變數 工作經驗
e3 = np.random.normal(0, 1, n)  # 誤差項 e3
Y = 3 * M + 1.5 * X + e3  # 因變數 年收入

# 構造 DataFrame
data = pd.DataFrame({'X': X, 'M': M, 'Y': Y})

# 逐步迴歸分析
# 步驟1: 檢驗 X 對 Y 的總效應
X_with_const = sm.add_constant(X)
model1 = sm.OLS(Y, X_with_const).fit()

# 步驟2: 檢驗 X 對 M 的效應
model2 = sm.OLS(M, X_with_const).fit()

# 步驟3: 檢驗 X 和 M 對 Y 的效應(控制中介效應)
XM_with_const = sm.add_constant(pd.DataFrame({'X': X, 'M': M}))
model3 = sm.OLS(Y, XM_with_const).fit()

# 統計結論
# 只輸出 p 值的判斷結果,並保留兩位小數

print("\n統計結論:")
# 步驟1結論
if model1.pvalues[1] < 0.05:
    print("1. 教育水平 X 對年收入 Y 的總效應顯著,p < 0.05。")
else:
    print("1. 教育水平 X 對年收入 Y 的總效應不顯著,p >= 0.05。")

# 步驟2結論
if model2.pvalues[1] < 0.05:
    print("2. 教育水平 X 對工作經驗 M 的影響顯著,p < 0.05。")
else:
    print("2. 教育水平 X 對工作經驗 M 的影響不顯著,p >= 0.05。")

# 步驟3結論
if model3.pvalues[1] < 0.05:
    print("3. 在控制工作經驗 M 後,教育水平 X 對年收入 Y 的直接效應顯著,p < 0.05。")
else:
    print("3. 在控制工作經驗 M 後,教育水平 X 對年收入 Y 的直接效應不顯著,p >= 0.05。")

if model3.pvalues[2] < 0.05:
    print("4. 工作經驗 M 對年收入 Y 的影響顯著,p < 0.05。")
else:
    print("4. 工作經驗 M 對年收入 Y 的影響不顯著,p >= 0.05。")

# Sobel 檢驗
a = model2.params[1]  # X -> M 的係數
b = model3.params[2]  # M -> Y 的係數
sa = model2.bse[1]  # X -> M 的標準誤
sb = model3.bse[2]  # M -> Y 的標準誤

# Sobel 統計量
sobel_z = (a * b) / np.sqrt(b**2 * sa**2 + a**2 * sb**2)
sobel_p = 2 * (1 - stats.norm.cdf(np.abs(sobel_z)))

print(f"\nSobel 檢驗: z = {sobel_z:.2f}, p = {sobel_p:.2f}")
if sobel_p < 0.05:
    print("5. 中介效應顯著,間接效應 p < 0.05。")
else:
    print("5. 中介效應不顯著,間接效應 p >= 0.05。")

# Bootstrap 方法
def bootstrap_mediation(data, num_bootstrap=1000):
    boot_ab = []
    for _ in range(num_bootstrap):
        sample = resample(data)
        X_bs = sample['X']
        M_bs = sample['M']
        Y_bs = sample['Y']

        # Bootstrap 迴歸
        model_bs_1 = sm.OLS(M_bs, sm.add_constant(X_bs)).fit()
        model_bs_2 = sm.OLS(Y_bs, sm.add_constant(pd.DataFrame({'X': X_bs, 'M': M_bs}))).fit()

        a_bs = model_bs_1.params.iloc[1]  # 使用 iloc 解決 FutureWarning
        b_bs = model_bs_2.params.iloc[2]  # 使用 iloc 解決 FutureWarning
        boot_ab.append(a_bs * b_bs)
    
    boot_ab = np.array(boot_ab)
    return np.percentile(boot_ab, [2.5, 97.5]), np.mean(boot_ab)

# 執行 Bootstrap
ci, ab_mean = bootstrap_mediation(data)
print(f"\nBootstrap 方法: ab 均值 = {ab_mean:.2f}, 95% 置信區間 = [{ci[0]:.2f}, {ci[1]:.2f}]")
if ci[0] > 0:
    print("6. Bootstrap 方法表明中介效應顯著,95% 置信區間不包含 0。")
else:
    print("6. Bootstrap 方法表明中介效應不顯著,95% 置信區間包含 0。")
統計結論:
1. 教育水平 X 對年收入 Y 的總效應顯著,p < 0.05。
2. 教育水平 X 對工作經驗 M 的影響顯著,p < 0.05。
3. 在控制工作經驗 M 後,教育水平 X 對年收入 Y 的直接效應顯著,p < 0.05。
4. 工作經驗 M 對年收入 Y 的影響顯著,p < 0.05。
   Sobel 檢驗: z = 53.05, p = 0.00
5. 中介效應顯著,間接效應 p < 0.05。
   Bootstrap 方法: ab 均值 = 6.03, 95% 置信區間 = [5.79, 6.26]
6. Bootstrap 方法表明中介效應顯著,95% 置信區間不包含 0。

總結

因果推斷取得了顯著的進展,但在實際應用中仍然面臨諸多挑戰。首先,資料質量往往限制了因果推斷的準確性。其次,在複雜系統中,因果關係往往具有多層次和多因多果的特性,這使得因果模型的構建和驗證變得非常複雜。最後,在許多領域,干預實驗的實施受到倫理和實際條件的限制,如何透過非實驗資料進行可靠的因果推斷仍然是一個重要的研究方向。隨著大資料技術、人工智慧和統計學理論的不斷髮展,因果推斷將繼續深入各個學科領域,推動更精確的科學發現和更有效的政策制定。特別是在資料日益豐富的今天,因果推斷的理論與方法將在揭示覆雜系統中的因果關係方面發揮越來越重要的作用。

因果推斷與中介效應

參考資料

  1. 中介因果效應分解 彙總與理解
  2. 中介效應分析:方法和模型發展
  3. 因果推斷經驗研究中的中介效應與調節效應

相關文章