causalMLによる因果探索コード例

!pip install causalml

 

import pandas as pd

import numpy as np

from causalml.inference.meta import BaseTRegressor

from sklearn.ensemble import RandomForestRegressor

 

# サンプルデータ生成

np.random.seed(42)

n_samples = 500

 

# データフレーム作成

data = pd.DataFrame({

    "Treatment": np.random.choice([0, 1], size=n_samples),  # 介入変数

    "Outcome": np.random.normal(size=n_samples),           # 結果変数 (連続値)

    "Confounder_A": np.random.normal(size=n_samples),      # 交絡因子1

    "Confounder_B": np.random.normal(size=n_samples),      # 交絡因子2

})

 

# 因果推定モデルの構築

confounders = ["Confounder_A", "Confounder_B"]

model = BaseTRegressor(learner=RandomForestRegressor())  # Regressionモデルに変更

 

# モデルの学習

X = data[confounders]

y = data["Outcome"]

w = data["Treatment"]

 

model.fit(X=X, treatment=w, y=y)

 

# 因果効果の推定

te = model.predict(X=X)

print(f"Estimated treatment effect: {te.mean():.4f}")

import networkx as nx

import matplotlib.pyplot as plt

 

# DAG描画用の関数

def draw_dag(labels, edges):

    """

    DAGを描画する関数。

   

    labels: ノードのラベル (: ["X1", "X2", "X3", "X4"])

    edges: 辺のリスト (: [("X1", "X2"), ("X1", "X3"), ("X2", "X4")])

    """

    # 有向グラフを作成

    G = nx.DiGraph()

    G.add_nodes_from(labels)

    G.add_edges_from(edges)

 

    # グラフの描画

    plt.figure(figsize=(8, 6))

    pos = nx.spring_layout(G)

    nx.draw(G, pos, with_labels=True, node_color="lightblue", node_size=2000, font_size=10, font_color="black")

    plt.title("Causal DAG")

    plt.show()

 

# ノードとエッジを指定

labels = ["X1", "X2", "X3", "X4"]

edges = [("X1", "X2"), ("X1", "X3"), ("X2", "X4"), ("X3", "X4")]

 

# DAG描画関数を呼び出す

draw_dag(labels, edges)

出力結果

Requirement already satisfied: causalml in /usr/local/lib/python3.11/dist-packages (0.15.4)

省略

Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas>=0.24.1->causalml) (1.17.0)

Estimated treatment effect: -0.0668











背景

このコードは、観測データに基づいて介入(Treatment)が結果(Outcome)に与える因果効果を推定するものです。因果推定のコンセプトにおいて、介入変数と結果変数の間の直接的な関係を確認しつつ、交絡因子(Confounder)が影響を与える可能性を考慮する必要があります。

使用されているcausalmlライブラリは、因果推定を行うための機能を提供し、特に介入効果の計算や視覚化をサポートします。回帰タスクを扱う場合、BaseTRegressorを使用して連続変数(結果)の因果効果を推定しています。

設定条件

1.       データ生成

o    介入変数(Treatment ランダムに0(介入なし)または1(介入あり)を設定。

o    結果変数(Outcome)正規分布に従う連続値のデータを生成。

o    交絡因子(Confounder_A, Confounder_B交絡因子として正規分布に従うランダムな値を生成し、介入と結果の両方に影響を与える可能性があります。

この部分では、500件のサンプルが生成されています。

2.       因果推定モデル:

o    回帰タスクに適したBaseTRegressorを使用。

o    学習器としてRandomForestRegressor(非線形回帰モデル)を選択。

目的

このコードの目的は以下の通りです:

1.       介入効果の推定:

o    交絡因子の影響を調整しながら、介入(Treatment)の結果(Outcome)への直接的な効果を評価。

o    平均治療効果(ATE: Average Treatment Effect)を計算する。

2.       モデルの柔軟性:

o    結果変数が連続値である場合、BaseTRegressorに基づいて回帰モデルを適用。

o    非線形な因果関係をキャプチャするため、ランダムフォレスト回帰を選択。

3.       実データへの応用:

o    シミュレートされたデータを基に因果推定モデルの機能を理解し、実際のデータセットに応用可能な手法を学ぶ。

まとめ

このコードは、因果推定の基礎を学ぶ上で非常に有用であり、交絡因子を考慮した介入効果の推定方法を示しています。


※追加したDAG描写コードの説明

コードのポイント

1.       networkxDAGを構築:

o    nx.DiGraph() を使ってDAG(有向グラフ)を作成します。

o    ノード(変数)とエッジ(因果リンク)を追加してグラフを定義。

2.       エッジリストで因果構造を指定:

o    各因果リンクはタプル(例: ("X1", "X2"))として定義され、方向性を持っています。

3.       matplotlibで視覚化:

o    グラフのレイアウトを設定し、ラベルやノードの色、大きさを指定して見やすく描画します。

これで因果関係を視覚的に確認することができます。

このブログの人気の投稿

片貝の四尺玉は世界一を連呼する『片貝賛歌~希望の花~』を作詞しました!!

小論文 統計的因果推論の現場適用による排泄ケアの展望

論文 排泄ケアにおける尊厳の保持と社会システムの課題 ~「おむつ」をめぐる心理的・文化的考察~