DAGの描き方

Author

田中 鮎夢

Published

July 14, 2024

1 はじめに

  • DAG(有向非巡回グラフ)を描くためのツールは色々ある。
  • それぞれのパッケージに良い点、限界があり、一概にどれが良いか判断するのは難しい。2024年時点では、日本語も使えるggdagパッケージが一番使いやすいと考える。
  • ここでは、ggdagパッケージ、DAGittyパッケージに加えて、Quatroでネイティブに使えるmermaidパッケージを中心に、RでDAGを描く方法を紹介する。

2 ggdagパッケージ

2.1 ggdagパッケージのセット

library(ggdag)

Attaching package: 'ggdag'
The following object is masked from 'package:stats':

    filter
library(ggplot2)
theme_set(theme_dag())

2.2 例1: 自動配置

library(ggdag)
library(ggplot2)
theme_set(theme_dag())

dag2 <- dagify(y ~ z + eta,
  z ~ eta,
  x ~ eta,
  labels = c(
    "y" = "若年雇用",
    "z" = "最低賃金",
    "eta" = "労働需要/景気η",
    "x" = "成人の雇用"
  ),
  latent = "eta",
  exposure = "z",
  outcome = "y"
)
#ggdag_paths(dag1, text = TRUE, use_labels = "label", label_size = 2)
#ggdag(dag2, text = TRUE, use_labels = "label", label_size = 2) +
#  theme_dag()
ggdag_status(dag2, text = TRUE, use_labels = "label", label_size = 2)

2.3 例2:時系列配置

  • time_ordered_coords関数を指定しないと、自動的に配置が決められてしまう。経済のデータは時系列性を持つことが通常なので、時間順序を指定しておいた方が綺麗なDAGになる。
  • 以下では、Causal Inference in Rからの例を参考にしてDAGを作図する。
library(ggdag)
library(ggplot2)
theme_set(theme_dag())

dag3 <- dagify(y ~ z + eta,
  z ~ eta,
  x ~ eta,
  labels = c(
    "y" = "若年雇用",
    "z" = "最低賃金",
    "eta" = "労働需要/景気η",
    "x" = "成人の雇用"
  ),
  coords = time_ordered_coords(
    list(
      # time point 1
      "eta",
      # time point 2
      "z",
      # time point 3
      c("y", "x")
      )
  ),
  latent = "eta",
  exposure = "z",
  outcome = "y"
    
)

#ggdag_paths(dag1, text = TRUE, use_labels = "label", label_size = 2)
#ggdag(dag3, text = TRUE, use_labels = "label", label_size = 2) +
#  theme_dag()
ggdag_status(dag3, text = TRUE, use_labels = "label", label_size = 2)

2.4 データ

# DAGのデータを確認する
tidy_dagitty(dag3)
# A DAG with 4 nodes and 4 edges
#
# Exposure: z
# Outcome: y
# Latent Variable: eta
#
# A tibble: 6 × 9
  name      x     y direction to     xend  yend circular label         
  <chr> <int> <int> <fct>     <chr> <int> <int> <lgl>    <chr>         
1 eta       1     0 ->        x         3     1 FALSE    労働需要/景気η
2 eta       1     0 ->        y         3    -1 FALSE    労働需要/景気η
3 eta       1     0 ->        z         2     0 FALSE    労働需要/景気η
4 x         3     1 <NA>      <NA>     NA    NA FALSE    成人の雇用    
5 y         3    -1 <NA>      <NA>     NA    NA FALSE    若年雇用      
6 z         2     0 ->        y         3    -1 FALSE    最低賃金      

2.5 初期設定を変える

  • DAGのグラフで、ラベルが矢印と重なってしまうことが多い。
  • これを回避するのは容易ではないが、以下のように初期設定を変えることで、少し改善できる。
theme_set(
  theme_dag() %+replace%
    # also add some additional styling
    theme(
      legend.position = "bottom",
      strip.text.x = element_text(margin = margin(50, 0, 50, 0, "mm"))
    )
)

2.6 例3:初期設定を変えたDAG

library(ggdag)
library(ggplot2)
theme_set(theme_dag())

dag4 <- dagify(y ~ z + eta,
  z ~ eta,
  x ~ eta,
  labels = c(
    "y" = "若年雇用",
    "z" = "最低賃金",
    "eta" = "労働需要/景気η",
    "x" = "成人の雇用"
  ),
  coords = time_ordered_coords(
    list(
      # time point 1
      "eta",
      # time point 2
      "z",
      # time point 3
      c("y", "x")
      )
  )
    
)

#ggdag_paths(dag1, text = TRUE, use_labels = "label", label_size = 2)
ggdag_status(dag4, text = TRUE, use_labels = "label", label_size = 2) +
  theme_dag()

3 DAGitty

  • dagittyパッケージは、DAGを描くためのパッケージで、Rのパッケージの中では最も有名なものの一つである。しかし、日本語が使えないので、日本語を使いたい場合は、ggdagパッケージを使うのが良い。

  • 矢内 勇生氏のサイトが、dagittyパッケージとggdagパッケージのわかりやすい説明を行っている。

  • DAGittyが公式サイト。

  • Directed Acyclic Graphs in R with dagitty and ggdagを参考に、dagittyパッケージを使ってDAGを描く。

3.1 dagittyパッケージによるによる実例

library("dagitty")
dag4 <- dagitty("dag{
                   labor_demand -> minium_wage -> youth_employment
                   labor_demand -> youth_employment
                   labor_demand -> adult_employment}
                   ")

# 座標の設定。xは横方向、yは縦方向。座標は0から始まる。y = -1は、上方に配置。
coordinates(dag4) <- list(
  x = c(labor_demand = 0, minium_wage = 1, youth_employment = 2, adult_employment = 1),
  y = c(labor_demand = 0, minium_wage = -1, youth_employment = 0, adult_employment = -0.5)
)


plot(dag4)

4 DiagrammeRパッケージ

4.1 DiagrammeR with mermaid

library(DiagrammeR)

mermaid("
            graph LR
            E(内生変数E <br> 教育年数)-->Y(所得Y)
            Z(操作変数Z <br> 自宅のある郡に <br> 大学があるか)-->E
            U(観測できない変数 <br> 能力U)-->E
            U-->Y
            ")

5 mermaidパッケージ

  • Quatroでは、DiagrammeRを使わなくても、mermaidパッケージをネイティブに使える。

  • Diagrams - Quatro