[掲示板へもどる]
一括表示

  [No.903] 共起ネットワークのエッジ色 投稿者:袋井  投稿日:2012/02/12(Sun) 12:33:26

樋口先生さま

お世話になります、袋井と申します。

毎々、マニアックな質問でお手を煩わせており、申し訳ございません。


グラフのノード数・エッジ数が増えて輻輳た場合の対処方法として、
SNAツール使う方法についてもご丁寧にご説明してくださっております。

私は、KH_coderの中で閉じて対処できる方法はないかと、考えております。


共起ネットワークのノードの色は、
ノードやグラフ全体の特質を考慮した指標、
更にセンスのよいカラーレインボーで与えられていることから、
直感的な理解を支援しております。
本当に素晴らしいと思います。

エッジについても工夫をすることで、グラフが輻輳した場合の複雑さを低減できないか、
考えています。


igraphパッケージに、MST(最小スパン木)の関数があります。
共起ネットワークグラフ(n2オブジェクト)にこれを適用できないか、考えています。

具体的には、
描画されたn2オブジェクトに対して、
MSTで得たエッジについて、例えば赤色太線で上書き表示することができないか、
考えています。

やはり私の欠しい知識ではうまくいきません。

ご教示いただければ助かります。

よろしくお願いいたします


  [No.904] 最小スパニング・ツリーによる共起ネットワークのEdge強調 投稿者:HIGUCHI Koichi  投稿日:2012/02/12(Sun) 16:14:25

最小スパニング・ツリーによる共起ネットワークのEdge強調 (画像サイズ: 640×640 32kB)

こんにちは、樋口です。書き込みありがとうございます。

いえいえ、初心者の方には「マニアック」に見えようかと思いますが、少し手
慣れてきてRも触ってみてという段階の方には、なかなかおもしろいTipsにつ
ながる書き込みと思います。また私にとっても開発のヒントになります。いつ
もありがとうございます。

さて今回は、最小スパニング・ツリー(minimum spanning tree)の観点から、
重要とみられるedgeを検出し、それを赤色で表示するということですね。今回
もかなりおもしろそうと思います。

共起ネットワークを「R Source」形式で保存し、このファイルの末尾に以下を
付け加えて実行してください。色指定の部分は、お好きな色に変更していただ
けます。HTMLのカラーコードが使えます。 http://www.colordic.org/

また「edge.label」の箇所の「#」を削除すると、edgeのjaccard係数が表示さ
れます。確認用に使えるかもしれません。


#---------------------------------------------------------------------
# MSTの検出
mst <- minimum.spanning.tree(
    n2,
    weights = 1 - get.edge.attribute(n2, "weight"),
    algorithm="prim"
)

# MSTに合致するedgeの色を赤く
if (length(edg_col) == 1){
    edg_col <- rep(edg_col, ecount(n2) )
}

for ( i in 1:ecount(n2) ){
    name_n2 <- paste(
        get.edgelist(n2,name=T)[i,1],
        get.edgelist(n2,name=T)[i,2]
    )
    for ( j in 1:ecount(mst) ){
        name_mst <- paste(
            get.edgelist(mst,name=T)[j,1],
            get.edgelist(mst,name=T)[j,2]
        )
        if ( name_n2 == name_mst ){
            edg_col[i] <- "#B22222"                   # ここで色指定
            break
        }
    }
}

# プロット
plot.igraph(
    n2,
    vertex.label        = "",
    vertex.color       =ccol,
    vertex.frame.color =com_col_v,
    vertex.size        =v_size,
    vertex.shape       =v_shape,
    edge.color         =edg_col,
    edge.lty           =edg_lty,
    edge.width         =edg_width,
    #edge.label         =round( get.edge.attribute(n2, "weight"), 3),
    #edge.label.cex     =0.8,
    layout             =lay_f,
    rescale            =F
)

# 語のラベルを追加
lay_f_adj <- NULL
if (smaller_nodes ==1){
    if ( is.null(lay_f_adj) == 1){
        lay_f_adj <- cbind(lay_f_adj, lay_f[,1])
        lay_f_adj <- cbind(lay_f_adj, lay_f[,2] + ( max(lay_f[,2]) - min(lay_f[,2]) ) / 38 )
    }
    text(
        lay_f_adj,
        labels = colnames(d)
                 [ as.numeric( get.vertex.attribute(n2,"name") ) ],
        pos = 4,
        offset = 0.25,
        font = text_font,
        cex = f_size,
        col = "black"
    )
} else {
    text(
        lay_f,
        labels = colnames(d)
                 [ as.numeric( get.vertex.attribute(n2,"name") ) ],
        #pos = 4,
        #offset = 1,
        font = text_font,
        cex = f_size,
        col = "black"
    )
}
#---------------------------------------------------------------------

p.s.
些末なことながら、前から少し気になっていたのですが、「先生」と「さま」
はどちらか片方で十分かと思われます。両方付いていると、いかにも偉そうで
すし (^_^


  [No.905] Re: 最小スパニング・ツリーによる共起ネットワークのEdge強調 投稿者:袋井  投稿日:2012/02/12(Sun) 20:35:51

樋口先生さま

お世話になります、袋井と申します。

早々に素晴らしいプログラムをご教示いただき、誠にありがとうございました。
心より御礼を申し上げます。

さっそく実行させていただきました。

MST(最小スパン木)は、別の用途で利用した経験がございますが、
共起ネットワークグラフの骨格を提示することでも役立つという印象をもちました。

結果を詳しく分析して、効果を検証させていただきます。


些細なことですが、私の環境では、実行終了時に以下のエラーメッセージが表示されます。
私の環境(PC、データ)固有の問題かもしれませんが、念のために、お示しをしておきます。

以下にエラー
text.default(lay_f_adj, labels = colnames(d)[as.numeric(get.vertex.attribute(n2, : オブジェクト 'text_font' がありま


色々とありがとうございました。


  [No.906] Re: 最小スパニング・ツリーによる共起ネットワークのEdge強調 投稿者:HIGUCHI Koichi  投稿日:2012/02/12(Sun) 22:11:17

こんにちは、樋口です。書き込みありがとうございます。

> 以下にエラー
> text.default(lay_f_adj, labels = colnames(d)[as.numeric(get.vertex.attribute(n2, : オブジェクト 'text_font' がありま

ここでエラーが出る場合は、上記追加プログラムの「font = text_font,」の
前に「#」を入れて、コメントアウトしておいて下さい(2箇所)。

※もしかすると、少し前のバージョンのKH Coderをお使いでしょうか。
KH Coder 2.b.27で保存した共起ネットワークの*.rファイルであれば、おそら
くこのエラーは出ないのではないかとも思います。

以上、補足までに。


  [No.907] Re: 最小スパニング・ツリーによる共起ネットワークのEdge強調 投稿者:袋井  投稿日:2012/02/13(Mon) 22:02:47

樋口先生さま

お世話になります、袋井と申します。

先生がおっしゃっる通り、古いバージョンを使っていたことが原因でした。
最新版に置き換えて実行したら、エラーは出ませんでした。
大変にお手数をお掛けいたしました。失礼をいたしました。

MSTで強調表示されたエッジ、ジャッカード係数、中心性指標を見比べております。
MST適用による効果はあり、主要な骨格を取り出しているように思えます。

MST自体の効果はあると思いますが、
エッジの重み(ジャッカード係数)も取り入れて精度の良い計算をされていることの効果が大きいのではないかと思いました。

先生、ご確認をさせてください。

中心性指標の計算では、次数、媒介、固有ベクトルの3種類をサポートされていますが、
媒介、固有ベクトルでは、エッジの重みも取り入れて計算をされているという理解でよろしいのでしょうか?

また、MSTの計算も同様な理解でよろしいのでしょうか?


MSTの効果を検証させていただきます。
色々とありがとうございました。


  [No.908] 共起ネットワークの各種計算とエッジの重み(jaccard係数) 投稿者:HIGUCHI Koichi  投稿日:2012/02/13(Mon) 23:14:21

こんにちは、樋口です。書き込みありがとうございます。

良いご質問です。というのも、エッジの有無(0-1)で計算しているのか、重
み(jaccard係数)を使っているのかは結構ややこしいので、この機会に
ちょっとまとめさせていただきます。

まず中心性ですが、次数中心性だけでなく媒介中心性についても、エッジの重
みは使わず、エッジの有無(0-1)で計算しているようです。ただし固有ベク
トル中心性では、エッジの重み(jaccard係数)を使っています。

次にサブグラフ検出ですが、同様に「媒介」ではエッジの有無(0-1)で計算
しているようですが、「modurality」の方では重み(jaccard係数)を使用し
ています。

あと、グラフの配置には重みを用いています。Fruchterman・Reingoldでも
Kamada・Kawaiでも同じです。

最後に、上記コマンドの最小スパニングツリーは、エッジの重みを考慮に入れ
たprimの方法で求めています。入力として(1 - jaccard係数)を渡している
ので、なるべく共起の程度が強いエッジを通る「ツリー」が形成されている
はずです。

ということで、「媒介」が重みを使っていない以外は大体直感に合う(?)形に
なっていますでしょうか。


  [No.909] Re: コマンドの一部修正 投稿者:HIGUCHI Koichi  投稿日:2012/02/14(Tue) 17:20:19

Re: コマンドの一部修正 (画像サイズ: 670×718 41kB)

こんにちは、樋口です。

最小スパニング・ツリーを表示する機能は、「共起ネットワーク」のオプショ
ンとして、KH Coderの次期バージョンに取り入れさせていただこうと考えてお
ります。今の所、添付の画面のような強調にする予定です。

ただ、次期バージョンの公開までにはまだ少し期間を要すると思いますので、
添付画面のような強調を行うための修正版Rコマンドを一応貼っておきます。

よろしかったらお使いください。

#---------------------------------------------------------------------
# MSTの検出
mst <- minimum.spanning.tree(
    n2,
    weights = 1 - get.edge.attribute(n2, "weight"),
    algorithm="prim"
)

# MSTに合致するedgeを強調
if (length(edg_col) == 1){
    edg_col <- rep(edg_col, ecount(n2) )
}
if (length(edg_width) == 1){
    edg_width <- rep(edg_width, ecount(n2) )
}

n2_edges  <- get.edgelist(n2,name=T);
mst_edges <- get.edgelist(mst,name=T);

for ( i in 1:ecount(n2) ){
    name_n2 <- paste(
        n2_edges[i,1],
        n2_edges[i,2]
    )
    for ( j in 1:ecount(mst) ){
        name_mst <- paste(
            mst_edges[j,1],
            mst_edges[j,2]
        )
        if ( name_n2 == name_mst ){
            edg_col[i]   <- "gray30"                   # edgeの色
            edg_width[i] <- 2                          # edgeの太さ
            if ( length(edg_lty) > 1 ){
                edg_lty[i] <- 1                        # edgeの線種
            }
            break
        }
    }
}

# プロット
plot.igraph(
    n2,
    vertex.label        = "",
    vertex.color       =ccol,
    vertex.frame.color =com_col_v,
    vertex.size        =v_size,
    vertex.shape       =v_shape,
    edge.color         =edg_col,
    edge.lty           =edg_lty,
    edge.width         =edg_width,
    #edge.label         =round( get.edge.attribute(n2, "weight"), 3),
    #edge.label.cex     =0.8,
    layout             =lay_f,
    rescale            =F
)

# 語のラベルを追加
lay_f_adj <- NULL
if (smaller_nodes ==1){
    if ( is.null(lay_f_adj) == 1){
        lay_f_adj <- cbind(lay_f_adj, lay_f[,1])
        lay_f_adj <- cbind(lay_f_adj, lay_f[,2] + ( max(lay_f[,2]) - min(lay_f[,2]) ) / 38 )
    }
    text(
        lay_f_adj,
        labels = colnames(d)
                 [ as.numeric( get.vertex.attribute(n2,"name") ) ],
        pos = 4,
        offset = 0.25,
        font = text_font,
        cex = f_size,
        col = "black"
    )
} else {
    text(
        lay_f,
        labels = colnames(d)
                 [ as.numeric( get.vertex.attribute(n2,"name") ) ],
        font = text_font,
        cex = f_size,
        col = "black"
    )
}
#---------------------------------------------------------------------


  [No.911] Re: コマンドの一部修正 投稿者:袋井  投稿日:2012/02/14(Tue) 20:05:06

樋口先生さま

お世話になります、袋井と申します。

ご丁寧にご説明をして下さいましたので、よく分かりました。
有難うございました。

MST対象エッジだけを取り出して確認しましたが、
元のグラフ上で強調表示する効果はあるな、という印象を持ちました。

重みを取り入れた計算の効果も大きいと感じています。

重みを取り入れた中心性、ユークリッド距離の計算をして比較をしましたが、
やはり、重みを取り入れることの効果は大きいと感じています。

素晴らしいプログラムを公開していただきました。

本日ははバレンタインデー、いいプレゼントをいただきました。
有難うございました。