Rを用いたLiverplotの描き方(RStudio)



 こんにちは、e-URO2023です。

我流で、論文や発表のために統計解析をしているのですが、

今回、初めてRiverplotなるものを描いてみたので、備忘録としてあげておきます。


ここで注意点です:

私は完全に我流で統計を学んでおり、計算式などはちんぷんかんぷんです。

また、プログラミングや言語についてもあまり理解できていません。

普段はEZRを使っていますが、EZRで解析しきれないような分析(IPTW method)やキレイなグラフを書きたいな、という理由で、最近Rstudioを使い始めました。

言語はなんとなくしか理解できていませんし、ネットで検索できるブログ記事を読み漁って参考にして、なんとかグラフを作成しています。

そこはご理解の上、ご一読ください。

統計のプロの方にもし見ていただけるのであれば、批評などぜひお願いします!


参考にしたサイト:

①シンペのアイロニカルデスク(https://shimpei.fun/?p=974)

②バイオインフォ 道場 [bioinfo-Dojo] (https://bioinfo-dojo.net/2017/08/18/r-rcolorbrewer_alpha/)

 


↓いつも参考にしている新谷先生の本です。

医療統計でつまづいている方、これから医療統計を始めようという方はぜひ読んでみてください!

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

今日から使える医療統計 [ 新谷歩 ]
価格:3,080円(税込、送料無料) (2023/9/10時点)


↓統計が全く分からなかったとき(大学院時代)に読んだ本です。

統計についてはこの本から勉強を始めました!

イチから学び始める方も、この本なら非常にわかりやすくてオススメです。


下準備


# まず今回使用するパッケージをインストールしましょう!

install.packages("riverplot")

install.packages("RColorBrewer")

 

# libraryで呼び出し

library("riverplot")
library(RColorBrewer)

 

# RColorBrewerを呼び出して、どのセットがよいか決めます

display.brewer.all()

すると こんなパレットが書き出されるので、この中から好きな組み合わせを選びます。


"Spectral"というパレットにしてみました。


# 使用するパレットの決定

colA <- brewer.pal(10, "Spectral")

"Spectral"には色が11種類あります。10と設定すると、真ん中の色が抜けるのかな?

colA[1]は一番左側の色、colA[2]は左から2番目の色…

という風に認識されるようです。 


①枠組みの作成

とりあえず、テーマを化学療法の推移、にしてみます。

まず、ざっくりと絵を描いてみましょう。

x軸と、それぞれのx軸において使用された化学療法をまず描きます。

x=1は1次化学療法、x=2は2次化学療法…という感じで、4次化学療法まで設定します。

化学療法は"A"、"B"、"C"、"D"という4種類を設定します。

一次化学療法でAを行った場合は"A1"になります。3次化学療法でDを行った場合は"D3"ですね。

残念ながら死亡された場合は、"E"に組み込みます。


そして、ここが少し複雑なのですが、みんなが4次化学療法まで進むわけではないですよね。

1次化学療法をずっと続けている方もいるはずです。

その場合のカテゴリーも作成します。"F"としましょう。


Liverplotを作る場合は、自分で手書きで下のように図を書き込んでいくと良いと思います。


次に色を決めます。同じ化学療法は同じ色にしましょう。

ここでは、"A"はcolA[2]、"B"はcolA[3]、"C"はcolA[4]、"D"はcolA[5]と設定します。

"E"はdeath、であり、勝手なイメージですが濃い紫のcolA[10]にしました。

また、"F"については"white"と設定します。この理由は最後にわかりますよ。


# nodesの設定

nodes <- data.frame(ID= c("A1","D1",

                          "A2","B2","C2","E2","F2",
                          "B3","E3","F3",
                          "A4","D4","E4","F4",
                          "E5","F5"), 
                    x= c(1,1,
                         2,2,2,2,2,
                         3,3,3,
                         4,4,4,4,
                         5,5), 
                    col= c(col=colA[2],col=colA[5],
                           col=colA[2],col=colA[3],col=colA[4],col=colA[10],"white",
                           col=colA[3],col=colA[10],"white",
                           col=colA[2],col=colA[5],col=colA[10],"white",
                           col=colA[10],"white"), 
                    stringsAsFactors= FALSE)

 

②点と点の推移を描く

次からがちょっと煩雑になってきます。

化学療法を施行された20人の患者さんの推移を追うことにしましょう。

"A"という化学療法が、一次化学療法として15人に施行されたとします。

そして"D"という化学療法は、一次化学療法として5人に施行されました。

合わせて20人ですね。

この15人、5人が次のフェーズでどのようになったかを記載する必要があります。



"A"の15名のうち、次治療として"B"が10人に、"C"が3人に施行されたとします。

また、1名は残念ながらAの治療中の亡くなられ、1名は"A"を継続中とします。

つまり、

"A1"から、"B2"に10人、"C2"に3人、"E2"に1人、"F2"に1人と移動することになりました。

また、一次化学療法で"D"が5人に施行され、1人は亡くなられ、4人は次治療として"A"が選択されたとします。

"D1"から、"A2"に4人、"E2"に1人移動することになります。

これを模式化したのが上の図になります。

ここで、"A1"からは4本の手が伸びており、"D1"からは2本の手が伸びていることがわかりますよね。

この、「手」の部分は

N1=c("A1","A1","A1","A1","D1","D1",…)

と表現します。


さらに、"A1"からは"B2","C2","E2","F2"へ手が伸びており、"D1"からは"A2","E2"へ手が伸びてます。ここは

N2=c("B2","C2","E2","F2","A2","E2",…)

と表現します!


次に移動した数を表現します。

Value=c(10,3,1,1,4,2,…)

とすることで、A1→B2へ10の移動、A1→C2へ3の移動、…と表すことができます!


これを模式化したのが上の図になります。


この推移を完成させると、以下の図になります!






最終的には以下のスクリプトになります!


# nodes間の移動

edges <- data.frame(N1= c("A1","A1","A1","A1","D1","D1",

                          "A2","B2","B2","C2","E2","F2",
                          "B3","B3","E3","F3",

                          "A4","D4","D4","E4","F4"), 
                    N2= c("B2","C2","E2","F2","A2","E2",
                          "B3","E3","F3","F3","E3","F3",
                          "A4","D4","E4","F4",
                          "E5","E5","F5","E5","F5"), 
                    Value= c(10,3,1,1,4,1,
                             4,7,3,3,2,1,
                             1,3,9,7,
                             1,1,2,9,7))


③Liverplotの書き出し

いよいよLiverplotの書き出しです。


# 図の書き出し

r <- makeRiver(nodes,edges)
plot(r)




A1、とかD1、とか文字が邪魔ですよね…

ラベルの消去を行うことができます。

nodes$labels = c("","","","",…


ラベルは16個あったので、"",が16個あればOKですね。

""の中になにもいれないことで、空白にすることができるようです。

他に文字を入れたいときは、その文字を入力すればよさそうですね!


# 図の書き出し

nodes$labels=c("","","","","","","","","","","","","","","","")

r <- makeRiver(nodes,edges)
plot(r)




最終的に、このようになりました!

なんか、ぽいですよね!?笑

治療継続中のヒトを"white"にすることで、(白背景に限りますが)うっすら消えていくように見えます。

色の設定を変えることで、工夫ができそうですね。


# まとめ

install.packages("riverplot")

install.packages("RColorBrewer")

library("riverplot")

library(RColorBrewer)

display.brewer.all()

colA <- brewer.pal(10, "Spectral")

nodes <- data.frame(ID= c("A1","D1",

                          "A2","B2","C2","E2","F2",

                          "B3","E3","F3",

                          "A4","D4","E4","F4",

                          "E5","F5"), 

                    x= c(1,1,

                         2,2,2,2,2,

                         3,3,3,

                         4,4,4,4,

                         5,5), 

                    col= c(col=colA[2],col=colA[5],

                           col=colA[2],col=colA[3],col=colA[4],col=colA[10],"white",

                           col=colA[3],col=colA[10],"white",

                           col=colA[2],col=colA[5],col=colA[10],"white",

                           col=colA[10],"white"), 

                    stringsAsFactors= FALSE)

edges <- data.frame(N1= c("A1","A1","A1","A1","D1","D1",

                          "A2","B2","B2","C2","E2","F2",

                          "B3","B3","E3","F3",

                          "A4","D4","D4","E4","F4"), 

                    N2= c("B2","C2","E2","F2","A2","E2",

                          "B3","E3","F3","F3","E3","F3",

                          "A4","D4","E4","F4",

                          "E5","E5","F5","E5","F5"), 

                    Value= c(10,3,1,1,4,1,

                             4,7,3,3,2,1,

                             1,3,9,7,

                             1,1,2,9,7))

nodes$labels=c("","","","","","","","","","","","","","","","")

r <- makeRiver(nodes,edges)

plot(r)



今回は以上になります!

皆様の論文作成や発表作成に少しでも参考になれば幸いです。

ご意見や批評などありましたら、↓↓↓まで書き込みお願いします!

コメント

このブログの人気の投稿

尿の臭い1

尿の臭い3