Rで解析:ERGMのモデル項を論文用の表にまとめる「tabulergm」パッケージの紹介
指数分布型ランダムグラフモデル(ERGM)でネットワークデータを分析すると、edgesやnodematchといった複数のモデル項を組み合わせた式を推定することになりますが、あてはめの結果に含まれる項の名前や推定値だけでは、その項が何を表しているのか伝わりにくいことがあります。しかし、モデル項ごとの説明文や数式、概念図を手作業で調べて論文や報告書向けの表にまとめるのは手間がかかります。
「tabulergm」パッケージは、ergmパッケージであてはめたモデルやERGMの式から、モデル項の名称・推定値・標準誤差に加えて、説明文や数式、概念図までを対応づけた表を生成できるパッケージです。モデル項の情報をデータフレームやMarkdown、HTML形式の表として整形する機能や、表と図をまとめてファイルへ保存する機能が収録されています。
また、モデル項ごとのタイトルや説明、引用情報を独自の内容に置き換えたり、概念図の描画方法を差し替えたりすることも可能です。本パッケージの利用で、ERGMの解析結果を論文や報告書向けの表へ整える作業を簡略化できるのではないかと考えます。
パッケージバージョンは0.1.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
<おすすめのRに関する書籍です>
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("tabulergm")
# パッケージの読み込み
library("tabulergm")
# コマンド例で使用するergmパッケージを読み込む
library("ergm")コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
ERGMは、ネットワークの辺がどのような統計的な特徴によって生じやすいかをモデル化する手法で、edgesやnodematchなど複数の項を組み合わせて式を作ります。あてはめの結果には各項の推定値や標準誤差が含まれますが、項の名前だけでは意味が伝わりにくいため、論文や報告書ではモデル項ごとの説明文や数式、概念図を添えるのが一般的です。
本パッケージは、ergmパッケージのあてはめ結果やERGMの式を読み取り、収録された用語集と照合してモデル項ごとの説明文・数式・概念図・引用情報を対応づけます。データフレームとして受け取るほか、MarkdownやHTML形式の表に整形したり、ファイルへまとめて保存したりできます。
以下の例では、北海道内10市町を頂点とし、災害時の相互応援協定の有無を辺とする無向ネットワークを作成します。道央・道南・道北・道東という地域区分が同じ市町どうしは協定を結びやすいと仮定した架空のデータをもとに辺を張り、edgesとnodematch項からなるERGMをあてはめます。
# 北海道内10市町を頂点として用意する
市町 <- c("札幌", "函館", "旭川", "帯広", "釧路",
"北見", "苫小牧", "稚内", "小樽", "室蘭")
# 各市町が属する地域区分(道央・道南・道北・道東)
地域区分 <- c("道央", "道南", "道北", "道東", "道東",
"道北", "道央", "道北", "道央", "道央")
# 無向ネットワークを初期化する
協定網 <- network.initialize(length(市町), directed = FALSE)
# 頂点にラベル(市町名)を設定する
network.vertex.names(協定網) <- 市町
# 頂点属性として地域区分を設定する
協定網 %v% "地域" <- 地域区分
# 市町の全2点組み合わせを求める
辺候補 <- t(combn(length(市町), 2))
# 同じ地域区分どうしは協定を結びやすいと仮定する
結びやすさ <- ifelse(地域区分[辺候補[,1]] == 地域区分[辺候補[,2]], 0.55, 0.15)
set.seed(20260823)
採用 <- runif(nrow(辺候補)) < 結びやすさ
# 採用された組み合わせに辺を張る
協定網[as.matrix(辺候補[採用, , drop = FALSE])] <- 1
# edgesとnodematch(地域)からなるERGMをあてはめる
モデル <- ergm(協定網 ~ edges + nodematch("地域"))
Starting maximum pseudolikelihood estimation (MPLE):
Obtaining the responsible dyads.
Evaluating the predictor and response matrix.
Maximizing the pseudolikelihood.
Finished MPLE.
Evaluating log-likelihood at the estimate.
summary(モデル)
Call:
ergm(formula = 協定網 ~ edges + nodematch("地域"))
Maximum Likelihood Results:
Estimate Std. Error MCMC % z value Pr(>|z|)
edges -1.0609 0.3867 0 -2.743 0.00609 **
nodematch.地域 1.4663 0.7525 0 1.949 0.05134 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Null Deviance: 62.38 on 45 degrees of freedom
Residual Deviance: 53.36 on 43 degrees of freedom
AIC: 57.36 BIC: 60.98 (Smaller is better. MC Std. Err. = 0)出版用テーブルの生成:tabulergm_tableコマンド
あてはめ済みのモデルやERGMの式から、モデル項ごとの推定値・標準誤差・p値に加えて、説明文や数式、概念図を対応づけた表を生成します。項のタイトルや説明を独自の内容に上書きすることもできます。
| オプション | 意味 | 初期値 |
|---|---|---|
| object | あてはめ済みのergmオブジェクト、またはERGMの式 | なし |
| format | 出力形式。”data.frame”(既定)、”html”、”markdown”のいずれか。html・markdown形式にはknitrパッケージが必要 | c(“data.frame”, “html”, “markdown”) |
| figures_dir | format = “markdown”のときの図の保存先ディレクトリ。NULLの場合、非対話的なレンダリング時にknitr/Quarto/R Markdownの図の保存先へ自動的にコピーされる | NULL |
| directed | ネットワークが有向かどうかの論理値。parse_ergm_formula()へ渡される。NULL(既定)の場合、式左辺のネットワークから可能なら自動判定する | NULL |
| include_title | モデル項の短いタイトル列を含めるかどうかの論理値 | FALSE |
| override | 項名をキーとする名前付きリスト。各要素は置き換えるフィールドを持つ名前付きリスト(例:list(edges = list(title = “Density”, citation = “doi:10.1234/x”)))。指定できるフィールドはtitle、description(またはdesc)、math、figure、citation | NULL |
| override.title | 項名をキーとする名前付き文字ベクトル(例:override.title = c(edges = “Density”))。overrideより優先される | NULL |
| override.desc | 項名をキーとする名前付き文字ベクトル。overrideより優先される | NULL |
| override.math | 項名をキーとする名前付き文字ベクトル。overrideより優先される | NULL |
| override.figure | 項名をキーとする名前付き文字ベクトル。overrideより優先される | NULL |
| override.citation | 項名をキーとする名前付きリスト。各要素はYAMLのcitation:フィールドと同じ形式の引用指定(キーのみ、doi:接頭辞付きの識別子、1件のリスト、または複数件のリストのいずれか) | NULL |
| … | メソッドへ渡す追加の引数 | なし |
figure列(項の概念図PNGへのパス)には実行環境のTempフォルダのパスが含まれるため、以下では数値列のみを表示しています。
# 基本のテーブルを生成する(figure列は環境依存のため除く)
表 <- tabulergm_table(モデル)
表[, c("term", "estimate", "se", "pvalue")]
term estimate se pvalue
1 edges -1.060872 0.3867356 0.006085376
2 nodematch (mcpherson2001) 1.466337 0.7524833 0.051335568
# タイトル列を含めて生成する
表2 <- tabulergm_table(モデル, include_title = TRUE)
表2[, c("term", "title", "estimate", "se", "pvalue")]
term title estimate se pvalue
1 edges Number of edges -1.060872 0.3867356 0.006085376
2 nodematch (mcpherson2001) Uniform homophily 1.466337 0.7524833 0.051335568
# タイトルと説明文を独自の内容に上書きする
表3 <- tabulergm_table(モデル, include_title = TRUE,
override.title = c(edges = "結びつきの基礎項"),
override.desc = c(edges = "自治体同士が防災協定を結ぶ基礎的な傾向を表す項"))
表3[, c("term", "title")]
term title
1 edges 結びつきの基礎項
2 nodematch (mcpherson2001) Uniform homophilyformat = “markdown”を指定すると、Markdown表と画像リンクを含む文字列が得られます。figures_dirへ相対パスを指定すると、その相対パスで画像リンクが作られます。
# Markdown形式で、図の保存先を相対パスで指定する
md <- tabulergm_table(モデル, format = "markdown", figures_dir = "figures")
cat(md, sep = "\n")
|term |figure | estimate| se| pvalue|
|:-------------------------|:----------------------------------------------------|---------:|---------:|---------:|
|edges |{width=80px} | -1.060872| 0.3867356| 0.0060854|
|nodematch (mcpherson2001) |{width=80px} | 1.466337| 0.7524833| 0.0513356|
*\[mcpherson2001\] [doi:10.1146/annurev.soc.27.1.415](https://doi.org/10.1146/annurev.soc.27.1.415)*ERGM式の解析:parse_ergm_formulaコマンド
あてはめをおこなわず、ERGMの式に含まれる各項の名称や属性、タイトルなどのメタデータだけを取り出します。ネットワークを推定する前に、式に含めた項の内容を確認したい場合に使えます。
| オプション | 意味 | 初期値 |
|---|---|---|
| formula | ERGMの式 | なし |
| directed | ネットワークが有向かどうかの論理値またはNULL。対応する項のメタデータ(数式・図)を選ぶために使用する。NULL(既定)の場合、式左辺のネットワークが評価できればそこから判定し、できなければ無向のメタデータを先に探し、次に有向のメタデータを探す | NULL |
| override | 項名をキーとする名前付きリスト。各要素は置き換えるフィールドを持つ名前付きリスト(例:list(edges = list(title = “Density”, citation = “doi:10.1234/x”)))。指定できるフィールドはtitle、description(またはdesc)、math、figure、citation | NULL |
| override.title | 項名をキーとする名前付き文字ベクトル(例:override.title = c(edges = “Density”))。overrideより優先される | NULL |
| override.desc | 項名をキーとする名前付き文字ベクトル。overrideより優先される | NULL |
| override.math | 項名をキーとする名前付き文字ベクトル。overrideより優先される | NULL |
| override.figure | 項名をキーとする名前付き文字ベクトル。overrideより優先される | NULL |
| override.citation | 項名をキーとする名前付きリスト。各要素はYAMLのcitation:フィールドと同じ形式の引用指定(キーのみ、doi:接頭辞付きの識別子、1件のリスト、または複数件のリストのいずれか) | NULL |
# 左辺にネットワークを持つ式から項の情報を取り出す
式情報 <- parse_ergm_formula(協定網 ~ edges + nodematch("地域"))
式情報[, c("term", "attribute", "title")]
term attribute title
1 edges <NA> Number of edges
2 nodematch 地域 Uniform homophily
# 左辺にネットワークがない式は directed を明示して同じ結果を得る
式情報2 <- parse_ergm_formula(~ edges + nodematch("地域"), directed = FALSE)
式情報2[, c("term", "attribute", "title")]
term attribute title
1 edges <NA> Number of edges
2 nodematch 地域 Uniform homophilyERGMモデルオブジェクトの解析:parse_ergm_modelコマンド
あてはめ済みのergmオブジェクトから、項ごとの係数名や推定値・標準誤差・p値と、対応するメタデータをまとめて取り出します。tabulergm_tableコマンドが内部で使っている処理を、表の形にせず直接呼び出すイメージです。
| オプション | 意味 | 初期値 |
|---|---|---|
| object | あてはめ済みのergmオブジェクト | なし |
| override | 項名をキーとする名前付きリスト。各要素は置き換えるフィールドを持つ名前付きリスト(例:list(edges = list(title = “Density”, citation = “doi:10.1234/x”)))。指定できるフィールドはtitle、description(またはdesc)、math、figure、citation | NULL |
| override.title | 項名をキーとする名前付き文字ベクトル(例:override.title = c(edges = “Density”))。overrideより優先される | NULL |
| override.desc | 項名をキーとする名前付き文字ベクトル。overrideより優先される | NULL |
| override.math | 項名をキーとする名前付き文字ベクトル。overrideより優先される | NULL |
| override.figure | 項名をキーとする名前付き文字ベクトル。overrideより優先される | NULL |
| override.citation | 項名をキーとする名前付きリスト。各要素はYAMLのcitation:フィールドと同じ形式の引用指定(キーのみ、doi:接頭辞付きの識別子、1件のリスト、または複数件のリストのいずれか) | NULL |
# あてはめ済みモデルから項ごとの情報を取り出す
モデル情報 <- parse_ergm_model(モデル)
モデル情報[, c("term", "coef_name", "attribute", "estimate", "se", "pvalue")]
term coef_name attribute estimate se pvalue
1 edges edges <NA> -1.060872 0.3867356 0.006085376
2 nodematch nodematch.地域 地域 1.466337 0.7524833 0.051335568
# タイトルと説明文を独自の内容に上書きする
モデル情報2 <- parse_ergm_model(モデル,
override.title = c(edges = "結びつきの基礎項"),
override.desc = c(edges = "自治体同士が防災協定を結ぶ基礎的な傾向を表す項"))
モデル情報2[, c("term", "title")]
term title
1 edges 結びつきの基礎項
2 nodematch Uniform homophily
<おすすめのRに関する書籍です>
テーブルと図の資産の保存:tabulergm_saveコマンド
tabulergm_tableコマンドで作る表と、項ごとの概念図をまとめて指定したディレクトリへ書き出します。MarkdownやLaTeXの原稿に、生成した表と図をそのまま取り込む場面で使えます。
| オプション | 意味 | 初期値 |
|---|---|---|
| object | あてはめ済みのergmオブジェクト、ERGMの式、またはtabulergm_table()が返すデータフレーム | なし |
| path | 保存先ディレクトリ。必要に応じて再帰的に作成される | なし |
| format | 書き出す形式を表す文字ベクトル。”markdown”と”latex”に対応。既定では両方書き出す | c(“markdown”, “latex”) |
| filename | 表のコードファイルの、拡張子を除いたファイル名 | “tabulergm-table” |
| images_dir | pathからの相対パスで画像を保存するディレクトリ。”.”を指定するとpath直下に保存される | “figures” |
| overwrite | 既存の表コードや画像ファイルを上書きするかどうかの論理値 | TRUE |
| latex_image_width | LaTeX出力で\includegraphicsへ渡す幅 | “0.7in” |
| … | ergmおよび式のメソッドではtabulergm_table()へ渡す追加の引数。data.frameのメソッドでは無視される | なし |
# 保存先ディレクトリ(相対パス)を指定してMarkdown形式で保存する
出力先 <- "tabulergm_出力"
tabulergm_save(モデル, 出力先, format = "markdown")
# 保存されたファイルを確認する
list.files(出力先, recursive = TRUE)
[1] "figures/edges.png" "figures/nodematch-mcpherson2001.png"
[3] "tabulergm-table.md"テーブルの表示:tabulergm_viewコマンド
tabulergm_tableコマンドと同じ内容をHTML形式に整形し、RStudioのViewerペイン(またはブラウザ)に直接表示します。コンソールに意味のある値は返らないため、実行結果は掲載していません。
| オプション | 意味 | 初期値 |
|---|---|---|
| object | あてはめ済みのergmオブジェクト、またはERGMの式 | なし |
| … | tabulergm_table()へ渡す追加の引数 | なし |
# モデルの内容をViewerペインに表示する
tabulergm_view(モデル)項の図のデフォルト描画関数:tabulergm_default_plotfunコマンド
tabulergmが項ごとの概念図を描く際に標準で使う関数の実体です。netplotパッケージを使ってネットワークを描画しており、後述のtabulergm_set_plotfunコマンドで独自の描画関数に差し替える際のひな形として参照できます。
| オプション | 意味 | 初期値 |
|---|---|---|
| netobj | network::networkオブジェクト | なし |
| layout | ノード座標(x, y)からなる2列の数値行列 | なし |
| vcolor | 頂点の色を表す文字ベクトル | なし |
| vshape | 頂点の形状を表す文字または数値ベクトル。”circle”/”square”や多角形の辺数など | なし |
| vrotation | 頂点の回転角度(度単位)を表す数値ベクトル | なし |
| ecolor | 辺の色を表す文字ベクトル | なし |
| directed | ネットワークが有向かどうかの論理値 | なし |
| vsize | 頂点の大きさを表す数値ベクトル | なし |
| elinetype | 辺の線種を表す数値または文字ベクトル | なし |
| … | 追加の引数(現在は未使用) | なし |
# デフォルトの実装を確認する
tabulergm_default_plotfun
function (netobj, layout, vcolor, vshape, vrotation, ecolor,
directed, vsize, elinetype, ...)
{
ewidth <- network::get.edge.attribute(netobj, "weight")
if (!length(vshape))
vshape <- "circle"
if (!length(vrotation))
vrotation <- 0
if (!length(vsize))
vsize <- 1
if (!length(elinetype))
elinetype <- "solid"
p <- netplot::nplot(netobj, vertex.color = vcolor, edge.color = ecolor,
edge.width = ewidth, layout = layout, vertex.size.range = c(0.15,
0.25, 1), edge.line.breaks = 1, vertex.nsides = vshape,
vertex.rot = vrotation, vertex.label = NA, edge.width.range = c(10,
10), vertex.size = vsize, edge.line.lty = elinetype)
print(p)
invisible(NULL)
}
<bytecode: 0x00000130f82be510>
<environment: namespace:tabulergm>
<おすすめのRに関する書籍です>
項の図の描画関数の設定:tabulergm_set_plotfunコマンド
項の概念図を描く関数を、独自に定義した関数へ差し替えます。差し替え前に使われていた関数が戻り値として返るため、変数に保持しておけば元の描画関数に戻せます。
| オプション | 意味 | 初期値 |
|---|---|---|
| plotfun | function(netobj, layout, vcolor, ecolor, directed, …)というシグネチャを持つ関数 | なし |
# 頂点と辺の色だけを使う簡略版の描画関数を定義する
自作プロット関数 <- function(netobj, layout, vcolor, ecolor, directed, ...) {
netplot::nplot(netobj, vertex.color = vcolor, edge.color = ecolor,
layout = layout)
}
# 現在の描画関数を控えておく
既定関数 <- tabulergm_get_plotfun()
# 描画関数を自作のものに差し替える(戻り値は差し替え前の関数)
tabulergm_set_plotfun(自作プロット関数)
# 差し替えが反映されたことを確認する
identical(tabulergm_get_plotfun(), 自作プロット関数)
[1] TRUE
# 元の描画関数に戻す
tabulergm_set_plotfun(既定関数)現在の描画関数の取得:tabulergm_get_plotfunコマンド
現在設定されている、項の概念図を描く関数を取得します。tabulergm_set_plotfunコマンドで差し替える前に元の関数を控えておく際に使います。
# 現在の描画関数を取得し、パッケージ標準の関数と同じか確認する
identical(tabulergm_get_plotfun(), tabulergm_default_plotfun)
[1] TRUE
<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。