Science2018.12.20ツイートTopicsはじめに事前準備LiNGAMをやってみる1000回やってみる最後にこんにちは。2018の20日目の記事です。はじめに最近、因果推論に関する読書会を始めました。第二回目が数日後にあるので、ご興味のある方はお越しください。初心者向けで古典的な手法を扱っている本です。他方でもっと現代的な手法について、何人かでワークショップをやっています。私はその中で、LiNGAMという手法を担当しています。因果構造探索に関する最近の発展」の65ページ以降が詳しくて、相関ではなくて因果関係を推測する有力な手法の一つです。国内で数少ないLiNGAMについての本ですが、残念ながらすぐ動かせるコードが有りません。そこで、以下でRでLiNGAMモデルを動かしてみます。modelの略で、日本語に訳すと「線形非ガウス型非巡回モデル」といったところでしょう。実務者としては、モデルが識別可能であるパス図を事前に推測しなくても、モデル推論ができるといったありがたい特徴があります。事前準備まず必要なライブラリーをインストールします。RでLiNGAMを実行するためのpcalgというパッケージはBioconductorというCRAN外のサイトにあるパッケージに依存しているので、そのケアも必要です。Rのバージョンが3.5.0未満の場合はこの手順ではインストールできませんのでお気をつけください。"RBGL"))install.packages("pcalg")主たるパッケージを読み込みます。library(tidyverse)library(pcalg)次に、分析用のデータフレームを4つ作成します。x2)散布図で確認します。df21gは、観測変数の分布が似ているため(書籍では「分布が同じ」と書かれています)、原因と結果の識別は困難です。df21nの方は、因果方向の異なるモデルの観測変数の分布が異なるため、上手く因果推論ができると期待されます。LiNGAMをやってみるpcaglパッケージを読み込んでいれば、データフレームをLiNGAM関数に食わせるだけです。lingam(df21n)とはいえ、これでは何もわからないので、まず因果グラフ(の隣接行列)を出力します。x1という因果関係を意味します。x1という因果関係が示唆されたということです。df21gも正しく識別できています。次に、定数項の推測をします。0.054756518真値は0なので、そこそこの精度と言えそうです。最後に残差誤差の標準偏差の推測値を見ます。0.9733218真値は1なので、いずれも推測できています。誤差がガウス分布に従うケースでも、正しく推測できていますが、どうもこれは「たまたま」だったようです。最初にデータフレームを作る際にset.seed(1234)と指定していますが、ここの値を変更すると、結果が変わることがありました。1000の1000とおりで同様の推測を実行してみました。df12gに関して標準偏差の推測値はと、約3分の1が真値から大きく外れていますが、df12nの方はと真値から大きくずれていません。最後に2変数間の因果推論という最も簡単なケースでしたが、一様分布の場合は100%の識別性を実現できました。実務的には変数の数はもっと多いので、組み合わせ爆発のリスクが伴います。それをどう解決するかは別のテーマになります。書籍ではベイズ的アプローチや、時系列データの扱い、未観測な共通原因がある場合などさまざまな手法が紹介されていますので、ぜひ原典をあたってみてください。