うだるような暑さですが、なんとか頑張ってます。
カプランマイヤーもggpubrで書けたら良かったのですが、ちょっと調べた感じは書けなそうだったので、ggsurvplotという違うライブラリを使ってみました。
はじめに
生存時間解析 (文字通りの生存時間以外にも、イベントが起こるまでの時間の推定などの時に使う) を行う際によく出てくるカプランマイヤー曲線を描いてみます。
カプランマイヤー曲線は生存率の推定値を表しており、曲線を比較することで議論をします。
Pythonで描いていた時はlifelines
をよく使っていました。グラフ作成をRに統一するなら、これもRでかけたほうが良いなと思って探したところ、ggsurvplotで書けるようです。
少し使った感じは、やはり簡単に書けるなあと言ったところですが、カスタマイズが少しやりにくかったかな?
あとドキュメントの充実具合はlifelinesの方が上な気もします。
データ
使用するデータはLungデータセットです。 肺がん患者さんの生存期間データですね。みた感じはこんな感じのデータです。
重要な変数は time: Survival time in days status: censoring status 1=censored, 2=dead sex: Male=1 Female=2 この辺りですね。 このデータを使ってカプランマイヤーを書いていきます。
処理と結果
まずは、ライブラリの読み込み
library(survival) library(survminer)
続いて、カプランマイヤー推定量の計算のために、survfitを行います。 いくつも変数がありますが、簡単のために最初は性別のみで分けてみます。
fit<- survfit(Surv(time, status) ~ sex, data = lung)
最後に、グラフ作成を行います。
ggsurvplot(fit, data = lung)
これだけでも比較的綺麗なグラフになります。
ここからいくつかの要素を足したりして、整えていきます。
カプランマイヤー曲線に信頼区間を表示する。
ggsurvplot(fit, data = lung, conf.int = TRUE)
生存期間中央値のラインを引く
ggsurvplot(fit, data = lung, conf.int = TRUE, surv.median.line = "hv")
リスク表を出す。 (各時点でのat riskの患者数)
ggsurvplot(fit, data = lung, conf.int = TRUE, surv.median.line = "hv", risk.table = TRUE)
カプランマイヤー曲線とリスク表の大きさの比率を変えてみる。
ggsurvplot(fit, data = lung, conf.int = TRUE, surv.median.line = "hv", risk.table = TRUE, surv.plot.height = 0.6, tables.height = 0.4)
グラフの軸ラベルフォントを変更
ggsurvplotはggparの引数を受け取れるようなので、そのまま入れると変更可能
ggsurvplot(fit, data = lung, conf.int = TRUE, conf.int.style = "step", surv.median.line = "hv", surv.plot.height = 0.75, tables.height = 0.25, xlab = "Survival rate", ylab = "Days", font.main = c(16, "bold"), font.x = c(16, "bold"), font.y = c(16, "bold"), font.tickslab = c(14,"bold"))
本当はrisk tableのフォントも変えられるけど、面倒なのでやっていない。 →やってみた。
ggsurvplot(fit, data = lung, conf.int = TRUE, risk.table = TRUE, conf.int.style = "step", surv.median.line = "hv", surv.plot.height = 0.75, tables.height = 0.25, xlab = "Survival rate", ylab = "Days", font.main = c(16, "bold"), font.x = c(16, "bold"), font.y = c(16, "bold"), font.tickslab = c(14,"bold"), tables.theme = theme_survminer(font.x = c(16, "bold"), font.y = c(16, "bold")))
感想
他にも色々いじれそうだけど、短時間で分かったのはこの辺りです。 また分かったら追記しようと思います。