DiagrammeRを使ってモデルを可視化する

以前ロジスティック回帰の結果を整形して表示するという記事を書きました。
今回は整形した結果をDiagrammeRを用いて可視化してみます。
まずはモデルを作ります。前回と同じロジスティック回帰のモデルです。

> res_glm <- glm(data=MASS::birthwt, low~age+smoke, family="binomial")

次にbroom::tidy関数で整形します。

> library("broom")
> (res_glm_tidy <- tidy(res_glm, exponentiate = TRUE, conf.int = TRUE))
         term  estimate  std.error   statistic    p.value  conf.low conf.high
1 (Intercept) 1.0627985 0.75731970  0.08042249 0.93590124 0.2426549  4.780114
2         age 0.9514394 0.03197195 -1.55696724 0.11947826 0.8918117  1.011394
3       smoke 1.9974047 0.32180606  2.14989327 0.03156366 1.0641120  3.770397

このモデルをDiagrammeRで描画します。
create_nodes/edgesは単にノードとエッジのデータフレームを作っているだけなので、data.frame関数でも代用できます。
エッジを作る際、res_glm$formula2で目的変数のlowを取り出し、文字列に変換しています。
2と指定しているのが気持ち悪いですね。
モデル式(formula)からもっと簡単に(formula["lhs"]みたいな感じ)目的変数を取り出す方法をご存じの方がいらっしゃたら教えてください。

さて、作成したノードとエッジをcreate_graphに渡して、グラフオブジェクトを作成し、render_graphに渡すことでグラフを描画します。
今回はRStudio上で描画し、Viewerに表示されたグラフをExportでpng画像で出力しています。

> library("DiagrammeR")
> nodes <- create_nodes(nodes = res_glm_tidy$term)
> edges <- create_edges(from = res_glm_tidy$term, 
+                       to = rep(as.character(res_glm$formula[[2]]), nrow(nodes)),
+                       label=round(res_glm_tidy$estimate, 2)
+ )
> graph <- create_graph(nodes_df = nodes,
+                       edges_df = edges)
> render_graph(graph)


今回は簡単な例で流れを示してみました。
未確認ですがパス図を使うようなsemパッケージとかlavaanパッケージには関数が実装されていそうです。
次回はより複雑な例を試してみます。

さて、全然関係ないですが以前より紹介していたAdvanced Rの邦訳の発売日が決まっていましたね!
1月24日発売だそうです。楽しみですね!

R言語徹底解説

R言語徹底解説

Enjoy!!!