データサイエンティスト上がりのDX参謀・起業家

データサイエンティスト上がりのDX参謀・起業家のブログ。データ分析や事業について。自身はアーティスト、経営者、事業家。

bnlearnの続き

Rでベイジアンネットの第二弾。

bnlearnでは基本的に条件付回帰を行っているので、その回帰係数もbn.fit関数で出力できます。

その回帰係数を、グラフに無理やり出力させるとこうなります。

親ノードは説明変数がないので、単純に平均値になってます。

これくらいの出力はパッケージに組み込まれてたら親切だったのになぁ(あとnnetみたいに矢印の太さが係数に比例するとか)。

igraphパッケージもパスを描くのに向いてそうなので、そのうちこっちも調べてみます。

コードはこちら(前半は以前のせた記事と同じコード。後半から係数を描いてます。)↓

library(bnlearn)

norm <- rnorm(4000)
Data <- matrix(norm, nrow=1000, ncol=4, byrow=T)
colnames(Data) <- c("Height", "BMI", "SBP", "FBS")
Data <- data.frame(Data)
Data2 <- Data
Data2$Height <- 170 + Data$Height*10
Data2$SBP <- 120 + Data$SBP*10
Data2$BMI <- 22 + Data$Height*2 + Data$BMI*2 + Data$SBP*2
Data2$FBS <- 90 + (Data2$BMI-22)*5 + Data$FBS*10
Data2 <- data.frame(Data2)
res.Data2 = gs(Data2)
plot(res.Data2)
res.arc2 <- set.arc(res.Data2, "FBS", "BMI")	#←HeightをFBSに修正
arc.strength(res.arc2, Data2)

#---回帰係数を求める
fitted = bn.fit(res.arc2, Data2)
(Coef <- coefficients(fitted))

#---絵に上書き
XMax <- max(axTicks(1))
YMax <- max(axTicks(2))

#---手動で位置を設定する
plot(res.Data2)
#切片
text(XMax*0.05, YMax*0.6, round(Coef$Height, digits=2), adj=0)
text(XMax*0.85, YMax*0.6, round(Coef$SBP, digits=2), adj=0)
text(XMax*0.35, YMax*0.9, round(Coef$FBS, digits=2), adj=0)
text(XMax*0.35, YMax*0.05, round(Coef$BMI[1], digits=2), adj=0)
#回帰係数
text(XMax*0.3, YMax*0.3, round(Coef$BMI[2], digits=3), adj=0)
text(XMax*0.65, YMax*0.3, round(Coef$BMI[3], digits=3), adj=0)
text(XMax*0.45, YMax*0.5, round(Coef$BMI[4], digits=3), adj=0)