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/)
↓いつも参考にしている新谷先生の本です。
医療統計でつまづいている方、これから医療統計を始めようという方はぜひ読んでみてください!
↓統計が全く分からなかったとき(大学院時代)に読んだ本です。
統計についてはこの本から勉強を始めました!
イチから学び始める方も、この本なら非常にわかりやすくてオススメです。
下準備
install.packages("riverplot")
install.packages("RColorBrewer")
library("riverplot")
library(RColorBrewer)
display.brewer.all()
すると こんなパレットが書き出されるので、この中から好きな組み合わせを選びます。
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 <- 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本の手が伸びていることがわかりますよね。
この、「手」の部分は
と表現します。
さらに、"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)
今回は以上になります!
皆様の論文作成や発表作成に少しでも参考になれば幸いです。
ご意見や批評などありましたら、↓↓↓まで書き込みお願いします!
コメント
コメントを投稿