TLDR: igraph の 2 つの頂点間のすべてのパスのエッジ タイプを抽出したいと思います。これを行うための比較的健全な方法はありますか?
私が最近勤務している診療所では、高校でかなり大規模な (1400 人) の結核接触者調査を実施しました。すべての生徒と教師 (!) のクラス スケジュールがあり、それらを (R の igraph を使用して) ネットワークに配置しました。各生徒と各部屋と期間の組み合わせを頂点として使用します (たとえば、期間の 123 号室のクラス)。 1 は、期間 2 の部屋 123 にあるクラスへの有向エッジを持つ頂点です)。私はまた、どの部屋が換気システムを共有しているかを知っています。グラフは唯一のソース ケースから出力されるため、ネットワーク上のすべてのパスには、可変数の部屋期間の頂点で区切られたソースと連絡先の 2 人だけが含まれます。概念的には、次の 4 種類のパスがあります。
- 個人的な接触による暴露 (ソース -> 接触のみ)
- 共有クラスの露出 (ソース -> ルーム期間 -> 連絡先)
- 次の期間の露出 (ソース -> 123 号室期間 1 -> 123 号室期間 2 -> 連絡先)
- 換気暴露 (ソース -> Room 123 Period 1 -> Room 125 Period 1 -> contact)
すべてのエッジには、それが人対人曝露、同室異期、換気エッジのいずれであるかを示す属性があります。
このネットワークで感染をモデル化するための中間ステップとして、学生がそれぞれのタイプの感染を何回経験したかを簡単に数えたいと思います。たとえば、学生が感染源とクラスを共有し、その後、感染源がいた部屋にいる可能性があります。その学生の指標は次のようになります。
personal.contact: 0
shared.class: 1
next.period: 1
vent: 1
ただし、この種の情報を取得する最善の方法はわかりません-個人的な連絡先リンクを簡単に特定できる最短パスを取得する関数がありますが、すべてのパスを評価する必要があると思います(これを尋ねるのはクレイジーなことのようです)典型的なソーシャルネットワークの場合、ソースとルーム期間のみがアウトエッジを持っている場合はそれほど怒っていません)。ソースから連絡先への各パスがエッジ タイプの順序付けられたベクトルによって表されるポイントにたどり着くことができれば、それらを自分の基準に簡単にサブセット化できると思います。そこにたどり着く方法がわかりません。igraph がこのための適切なフレームワークではなく、学生のスケジュールに大きな恐ろしいループを書く必要があるだけなら、それでいいのです! しかし、その穴に飛び込む前に、いくつかのガイダンスをいただければ幸いです。
以下は、3 つの間接パスのそれぞれとの連絡先のサンプル グラフです。
# Strings ain't factors
options(stringsAsFactors = FALSE)
library(igraph)
# Create a sample case
edgelist <- data.frame(out.id = c("source", "source",
"source", "Rm 123 Period 1",
"Rm 125 Period 2", "Rm 125 Period 3",
"Rm 127 Period 4", "Rm 129 Period 4"),
in.id = c("Rm 123 Period 1", "Rm 125 Period 2",
"Rm 127 Period 4", "contact",
"Rm 125 Period 3", "contact",
"Rm 129 Period 4", "contact"),
edge.type = c("Source in class", "Source in class",
"Source in class", "Student in class",
"Class-to-class",
"Student in class", "Vent link",
"Student in class"
)
)
samp.graph <- graph.data.frame(edgelist, directed = TRUE)
# Label the vertices with meaningful names
V(samp.graph)$label <- V(samp.graph)$name
plot(samp.graph, layout = layout.fruchterman.reingold)