ベイジアンネットワーク のRによる実施例です。
このページは、現時点では ベイジアンネットワークによるデータの構造解析 の方法だけをまとめています。 因果関係の分析として使われる方法になります。
library(bnlearn)
setwd("C:/Rtest")
Data <- read.csv("Data.csv", header=T)
ベイジアンネットワークでは、変数の型によって、結果が変わります。 変数の意味を考えながら、方針を決めると良いです。 また、型の違いと結果の違いを考察をすることで、データが表している現象の理解が深まることもあります。
質的変数は、characterとして自動認識されているとエラーになるため、因子型(factor)に変換します。
for (i in 1:ncol(Data)) {
if (class(Data[,i]) == "character") {
Data[,i] <- as.factor(Data[,i])
}
}
整数型が含まれる場合、integerとして自動認識されるため、数値型(numeric)か、因子型(factor)に変換する必要があります。 例えば、数字の大きさに特別な意味がない場合は、因子型にすると良いです。
数値型にする場合です。
for (i in 1:ncol(Data)) {
if (class(Data[,i]) == "integer") {
Data[,i] <- as.numeric(Data[,i])
}
}
因子型にする場合です。
for (i in 1:ncol(Data)) {
if (class(Data[,i]) == "integer") {
Data[,i] <- as.factor(Data[,i])
}
}
ベイジアンネットワークは、数値型だけや、数値型と因子型が混ざっていてもできるようになっていますが、 すべて因子型の方が、良い分析になることがあります。以下は、数値型は因子型にする方法です。
なお、もともと整数型の変数は、上記の整数型の処理で、数値型にするか、因子型にするのかで、このコードの結果は変わります。 因子型にしていれば、このコードでは何も変わりません。
for (i in 1:ncol(Data)) {
if (class(Data[,i]) == "numeric") {
Data[,i] <- droplevels(cut(Data[,i], breaks = 3, include.lowest = TRUE))
}
Data[,i] <- as.factor(Data[,i])
}
以下は、グラフの描画も一行のコードに入っています。
alphaがある手法は、0.05がデフォルトです。 この数字を小さくすると、結び付く部分が減って来ます。
plot(pc.stable(Data, alpha = 0.05),main = "PC")
plot(gs(Data, alpha = 0.05),main = "GS")
plot(iamb(Data, alpha = 0.05),main = "IAMB")
plot(fast.iamb(Data, alpha = 0.05),main = "Fast-IAMB")
plot(inter.iamb(Data, alpha = 0.05),main = "Inter-IAMB")
plot(iamb.fdr(Data, alpha = 0.05),main = "IAMB-FDR")
plot(mmpc(Data),main = "MMPC")
plot(si.hiton.pc(Data),main = "SI-HITON-PC")
plot(hpc(Data),main = "HPC")
plot(hc(Data),main = "HC")
plot(tabu(Data),main = "Tabu")
plot(mmhc(Data),main = "MMHC")
plot(h2pc(Data),main = "H2PC")
plot(rsmax2(Data),main = "RSMAX2")
plot(chow.liu(Data),main = "Chow_Liu")
plot(aracne(Data),main = "ARACNE")
上記はすべてbnlearnです。
これは、BNSLのライブラリになります。
library(BNSL)
plot(bnsl(Data),main = "BNSL")
これは、dealのライブラリになります。
library(deal)
pre.network <- network(Data)
prior.dist <- jointprior(pre.network)
update <- learn(pre.network, Data, prior.dist)
post.network <- autosearch(getnetwork(update), Data, prior.dist, trace=FALSE)
plot(getnetwork(post.network),main = "deal")
グラフを、ベイジアンネットワークのライブラリに入っている機能ではなく、igraphで作る方法です。
dealのものは、igraphに渡すデータの出し方がわからないで下記に含まれていません。
library(igraph)
plot(graph.data.frame(pc.stable(Data, alpha = 0.05)$arcs),main = "PC")
plot(graph.data.frame(gs(Data, alpha = 0.05)$arcs),main = "GS")
plot(graph.data.frame(iamb(Data, alpha = 0.05)$arcs),main = "IAMB")
plot(graph.data.frame(fast.iamb(Data, alpha = 0.05)$arcs),main = "Fast-IAMB")
plot(graph.data.frame(inter.iamb(Data, alpha = 0.05)$arcs),main = "Inter-IAMB")
plot(graph.data.frame(iamb.fdr(Data, alpha = 0.05)$arcs),main = "IAMB-FDR")
plot(graph.data.frame(mmpc(Data)$arcs),main = "MMPC")
plot(graph.data.frame(si.hiton.pc(Data)$arcs),main = "SI-HITON-PC")
plot(graph.data.frame(hpc(Data)$arcs),main = "HPC")
plot(graph.data.frame(hc(Data)$arcs),main = "HC")
plot(graph.data.frame(tabu(Data)$arcs),main = "Tabu")
plot(graph.data.frame(mmhc(Data)$arcs),main = "MMHC")
plot(graph.data.frame(h2pc(Data)$arcs),main = "H2PC")
plot(graph.data.frame(rsmax2(Data)$arcs),main = "RSMAX2")
plot(graph.data.frame(chow.liu(Data)$arcs),main = "Chow_Liu")
plot(graph.data.frame(aracne(Data)$arcs),main = "ARACNE")
library(BNSL)
plot(graph.data.frame(bnsl(Data)$arcs),main = "BNSL")
「Rと事例で学ぶベイジアンネットワーク」 Marco Scutari ・Jean-Baptiste Denis 著 共立出版 2022
Rのパッケージとして、deal、catnet、pcalg、abnが紹介されています。
「bnlearnのページ」
bnlearnの作者(Marco Scutari氏)のホームページです。
コンパクトにまとまっています。
https://www.bnlearn.com
「bnlearnのCRANのマニュアル」
bnlearnの詳細が書かれています。
https://cran.r-project.org/web/packages/bnlearn/bnlearn.pdf
「データマイニング入門 :Rで学ぶ最新データ解析」 豊田秀樹 編著 東京図書 2008
dealの使い方があります。
「RPubs Rでベイジアンネットワークメモ」
上記のコードは、このページを参考にさせていただきました。
https://rpubs.com/hoxo_m/21327
BNSLには、有向グラフだけでなく、無向グラフを作る機能もありますが、上記の例は有向グラフだけです。
「BNSLの概要」
BNSLの作者(鈴木 譲 氏)による解説です。
BNSLの無向グラフの機能は、変数が大量にあっても高速に計算できることが強みのようです。
bnlearnとの比較もあります。
https://prs.ism.ac.jp/useRjp/?plugin=attach&refer=2017%E5%B9%B4%E5%BA%A6%20%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E7%92%B0%E5%A2%83R%E3%81%AE%E6%95%B4%E5%82%99%E3%81%A8%E5%88%A9%E7%94%A8&openfile=2017-11-25.pdf
「BNSLのCRANのマニュアル」
BNSLの詳細が書かれています。
https://cran.r-project.org/web/packages/BNSL/BNSL.pdf