YutaroOgawa / causal_book

書籍「作りながら学ぶ! PyTorchによる因果推論・因果探索」の実装コードのリポジトリです
MIT License
113 stars 32 forks source link

【第7章5節】PCアルゴリズムの2次の独立性検定を実施するべき #10

Open YutaroOgawa opened 4 years ago

YutaroOgawa commented 4 years ago

みなさま

本書において、クリティカルに誤っている部分があるので、訂正いたします。 また本内容については、次回増刷時に書面は修正いたします。

@sabi2345さまのIssue「PCアルゴリズムの2次の独立性検定を実施しない理由について 」 https://github.com/YutaroOgawa/causal_book/issues/8

でしっかりと考えなおし、

[1] PCアルゴリズムの2次の独立性検定を実施するべき [2] 現在のデータでは、図7.5.6から、2次の独立性検定で[Y]ー[Y3]間の結合が切れてしまう

と判明しました。

ひとまず暫定的な修正を2つ提示させていただきます。

実装プログラムは修正済みです。

【1】p. 175第7章5節:PCアルゴリズムによる因果探索 その3:2次の独立性 文面を全て以下に変更。

========================== (修正後)  続いて「2次の独立性検定」を実施します。2次の独立性とは、2つの変数間にとある変数 2個を条件付きにした際の独立性の検定です。条件付きにする変数は対象とする変数と関連 があったものから選びます。  現在、3変数以上との関連があるのは変数Yのみです。変数Yは変数 x、z、Y3 の3変数と 関連しています。 CI(Y, x | Z, Y3)、CI(Y, Z | x, Y3)、CI(Y, Y3 | x, Z)の3つの独立性を検定を実施すると、


# 2020年7月24日追記
# 2次の独立性の検定 変数Y

print(est.test_conditional_independence(
    'Y', 'x', ['Z', 'Y3'], method="chi_square", tol=0.05))
print(est.test_conditional_independence(
    'Y', 'Z', ['x', 'Y3'], method="chi_square", tol=0.05))
print(est.test_conditional_independence(
    'Y', 'Y3', ['x', 'Z'], method="chi_square", tol=0.05))

(出力) False False False

となります。よって、図7.5.6からさらに切れる辺は存在しないことが分かりました。

では続いて3次の独立性検定を実施するかですが、そのためには、4変数以上とつながっている変数が対象と なります。  今回の疑似データではそのような変数は存在しないので独立性の検定はここで終了となります。 ただし、ネットワークの状況によっては、さらに高次の独立性の検定まで実施していきます。 ==========================

YutaroOgawa commented 4 years ago

修正【2】p. 163 第7章5節:疑似データ「上司向け:部下とのキャリア面談のポイント研修」の生成

(誤)


# 本章からの追加データを生成

# Y2:部下当人のチームメンバへの満足度 1から5の5段階
Y2 = np.random.choice([1.0, 2.0, 3.0, 4.0, 5.0],
                      num_data, p=[0.1, 0.2, 0.3, 0.2, 0.2])

# Y3:部下当人の仕事への満足度
e_y3 = randn(num_data)
Y3 = 3*Y + Y2 + e_y3

# Y4:部下当人の仕事のパフォーマンス
e_y4 = randn(num_data)
Y4 = 3*Y3 + 5 + 2*e_y4 

(修正)

# 本章からの追加データを生成

# Y2:部下当人のチームメンバへの満足度 1から5の5段階
Y2 = np.random.choice([1.0, 2.0, 3.0, 4.0, 5.0],
                      num_data, p=[0.1, 0.2, 0.3, 0.2, 0.2])

# Y3:部下当人の仕事への満足度
e_y3 = randn(num_data)
Y3 = 4*Y + Y2 + e_y3

# ※初版、第2版は20/7/24に変更
#  Y3 = 3*Y + Y2 + e_y3

# Y4:部下当人の仕事のパフォーマンス
e_y4 = randn(num_data)
Y4 = 3*Y3 + 5 + 2*e_y4 

=================== (変更の理由)

元の実装コードのままでは、 2次の独立性検定を実施すると、 [Y]ー[Y3]間の結合が切れてしまいます。

すなわち、

print(est.test_conditional_independence(
    'Y', 'Y3', ['x', 'Z'], method="chi_square", tol=0.05))

がTrueになってしまいます。

これは、Y3に対してYが与えている影響が小さすぎて独立と判定されてしまうためです。 そのため、Y3のYの係数を3から4へと大きくし、独立ではない模擬データに変更します。

この変更により、2次の独立性検定を実施しても、図7.5.6の結果と同じままになり、 本書の第7章5節の解説に変更はありません (上記の変更【1】部分のみ変更)

ただし、図7.5.12 ベイジアンネットワークでの推定結果の細かな数値は変化します。

(より細かい議論が気になる方は、https://github.com/YutaroOgawa/causal_book/issues/8をご覧ください

以上、読者の皆さまには大変ご迷惑と混乱を与える誤った記述をしており、申し訳ございません。 どうぞよろしくお願い致します。