mikutaifukuの雑記帳

個人的な雑記帳。データ分析とか読んだ本の感想とか。

Fitbitデータで因果を探索してみる 〜独立成分分析によるLiNGAMモデルの推定〜

はじめに

2018/2/11に日本経済新聞電子版にて以下のような記事が掲載されました。 f:id:mikutaifuku:20180218131146p:plain 元論文(日本経済研究センター JCER)の総論では、「博士増、生産性向上に結びつかず」と書かれており、大学教育や企業の活かし方に問題があるのでは、と問題提起をしています。

twitter等でも拡散され、盛り上がりました。 togetter.com

因果関係があるというのはなかなか難しく、疫学分野での因果推論の指標となっているヒルの因果関係ガイドラインを利用することが有用であると考えられています。
ヒルは事象Aが事象Bの原因であると結論付ける為に、以下の9つの規準

  1. 相関関係の強さ Aの生起とBの生起の間に強い相関関係がある
  2. 相関関係の一致性 相関関係の大きさは様々な状況で、対象や実証に利用よる手法が違っても一致している
  3. 相関関係の特異性 Bと「A以外に原因として想定される変数」の相関は高くない。またAと「B以外の結果変数」の相関も高くない
  4. 時間的な先行性 AはBに時間的に先行する
  5. 量・反応関係の成立 原因となる変数Aの値が大きくなると、単調に結果となる変数Bの値も大きくなる
  6. 妥当性 AがBの原因になっているという因果関係が生物学的に(または各分野の知見にもとづいて)もっともらしい
  7. 先行知見との整合性 これまでの先行研究や知見と首尾一貫している
  8. 実験による知見 動物実験等での実験研究による証拠がある
  9. 他の知見との類似性 すでに確立している別の因果関係と類似した関係・構造を有している

を満たしているかどうかチェックすることを推奨しています。*1
記事の内容が、上記のチェックリストにどれだけ満たしているかチェックしてみても面白いかもしれません。
また、今回の例では下記(ほんの一例)のように因果の向きは色々なパターンが考えられます。

f:id:mikutaifuku:20180218134133p:plain おそらく、上記論稿では過去の文献や調査などから、因果グラフが図でいうところの左上であるとみなして議論を進めたのだと思います。(たぶん)

このエントリでお話する「因果探索」とは、上記の中でどの因果グラフが正しいかをデータから推測することです。つまり、因果探索は因果グラフが未知の状態から、データを用いて仮説の候補を探索したりすることです。

ということで、例のごとく自分のFitbitデータを使ってやってみました。なお、本エントリは清水先生の書籍の1〜4章を参考にして書きました。

統計的因果探索 (機械学習プロフェッショナルシリーズ)

統計的因果探索 (機械学習プロフェッショナルシリーズ)

概要(やりたいこと)

Fitbitデータから取得できる、歩数・消費カロリーの因果関係を探ることです。
2017/01/01〜2017/12/31の1年間の歩数と消費カロリーデータをプロットしたのが以下の図です(横軸:歩数、縦軸:消費カロリー、相関係数:0.8)。 f:id:mikutaifuku:20180218030110p:plain
相関関係があるのは明らかですが、因果関係が以下のパターンのどれになるかを推測するのが目的です。

f:id:mikutaifuku:20180218135621p:plain
なお、今回は話を簡単にするために、

  • 歩数と消費カロリーに影響を与える他の未観測共通原因は存在しない

ことにします。未観測共通原因がある場合の話も今後したいと思います。

普通に考えれば「歩数を増やすと消費カロリーが増える」、つまり一番左の絵の「歩数→消費カロリー」が成り立ちそうですが、LiNGAMモデルを使って、これが本当に推測できるかをどうかを確かめてみます。

LiNGAMモデルとは

LiNGAMモデル(linear non-Gaussian acyclic model, LiNGAM)は因果グラフが識別可能なモデルです。ここで、識別可能とは

  • 因果グラフの構造が異なれば、観測変数の分布が必ず異なる。つまり、因果グラフが一意に推定できる。

ことを言います。LiNGAMは識別可能なモデルで、具体的には以下の条件を満たすモデルのことを言います。*2 f:id:mikutaifuku:20180218160655p:plain
今回の例は2変数(歩数・消費カロリー)なので、以下のLiNGAMモデルになります。係数行列のBを推定できれば、因果グラフを描くことができます。

f:id:mikutaifuku:20180218160714p:plain

独立成分分析によるアプローチ

計算の流れ

  1. x = Bx + e → (I - B)x = e → e = Wx より、独立成分分析を適用して、データ行列Xから復元行列Wを推定します

  2. 1で推定された復元行列 \hat{W}_{ICA}は、行の順序と尺度を一意に推測することができないので、適切な置換行列Pと尺度を変換する対角行列Dを推定します

  3.  {\hat{W} = \hat{D}^{-1} \hat{P} \hat{W}_{ICA}}で復元行列Wを推定します

  4.  {\hat{B} = I - \hat{W}}で行列Bを推定します

  5. 行列Bが厳密に下三角になるように(有向非巡回になるように)因果的順序を求めます

  6. 因果的順序に従い、係数行列Bを推定します

以上が、独立成分分析に基づくLiNGAMモデルの推定の流れになりますが、ここで書いたのはかなり雑な記述なので、詳細は書籍を読んでいただければと思います。

使用データ

上の散布図で示した通り、2017/01/01〜2017/12/31の1年間の歩数と消費カロリーデータを使用しました。欠損はありません。

図:歩数ヒストグラム f:id:mikutaifuku:20180218164353p:plain
図:消費カロリーヒストグラム f:id:mikutaifuku:20180218164450p:plain

歩数と消費カロリーのヒストグラムをみてわかるように、どちらもガウス分布に従ってそうで、LiNGAMモデルの仮定に当てはまらなさそうですが、書籍には

ただ、因果的順序を推測してしまえば、変数の推定には非ガウス性を利用する必要はありません。そのため、誤差変数の分布をガウス分布で近似することにして情報量規準を利用しても、実際の性能はそれほど悪くないでしょう

と書いているので、ここでは気にせずに進めます。*3

結果

pcalgパッケージ

独立成分分析でLiNGAMモデルを推定するにあたって、pcalgパッケージを使用しました。
graph, BiocGenerics, RBGLといったパッケージも同時にインストールする必要がありますが、こちらはCRANには登録されていないので、以下のサイトから圧縮ファイルをダウンロードして、Rにインストールしました。

www.bioconductor.org

データ

> tail(X)
       steps caloriesOut
[360,]  2747        2431
[361,] 12634        3290
[362,] 11148        3170
[363,]  3534        2424
[364,]  6282        2575
[365,]  6952        2734

推定結果

> library("pcalg")
> lingam(scale(X))
$Bpruned
          [,1] [,2]
[1,] 0.0000000    0
[2,] 0.8593356    0

となりました。$Bprunedは行列Bのことで、今回の例では  b_{12} =0となったので、「歩数→消費カロリー」の因果グラフを推定することができました。*4

さいごに

今回のエントリでは、Fitbitの歩数・消費カロリーデータに対して、因果グラフをLiNGAM法によって推定しました。
本来であれば、他の共通原因(心拍数etc)を加味する必要があるとは思いますが、次回以降に持ち越したいと思います。

最後に個人的に気になった点をMEMOしておきます。

  • 今回の分析は「1個人の反復測定データ」だったが、そもそもこのように因果探索してもいいのか
  • 連続変数でない時(0/1の二値変数etc)はできないのか
  • 結局、非ガウスでも因果的順序を使えば、LiNGAMモデルを推定できるのか
  • パラメータを推定できても、それが因果関係あるかは別じゃないのか

分からないことだらけですね。まだまだINPUTが足らないようなので、引き続き勉強頑張ります。

なお、本エントリは雰囲気で書いた部分も多いので、間違いがあれば遠慮なくご指摘くださいませ。

mikutaifuku

*1:調査観察データの統計科学―因果推論・選択バイアス・データ融合 (シリーズ確率と情報の科学)を引用しました。

*2:統計的因果探索 (機械学習プロフェッショナルシリーズ)P.95を参考に書きました。

*3:個人的なブログなので許してください。私の理解が浅いのもあり「因果的順序の決定→行列Bを推定」の場合は、非ガウス性の仮定がいるのかどうかわかりませんでした。

*4:行列Xをscaleで標準化しなかった場合は、「消費カロリー→歩数」となりました。係数を0に推定する過程で、標準化しておかないと不都合があるのでしょうか。この辺りも私にはよく分かりませんでした。