理系夫婦のうたたねブログ

理系夫婦が好きなことを書いていきます。たまに医学っぽいことを書いていますが、あくまで私見です。

Rでカプランマイヤー曲線をかく (ggsurvplot)

うだるような暑さですが、なんとか頑張ってます。
カプランマイヤーもggpubrで書けたら良かったのですが、ちょっと調べた感じは書けなそうだったので、ggsurvplotという違うライブラリを使ってみました。

はじめに

生存時間解析 (文字通りの生存時間以外にも、イベントが起こるまでの時間の推定などの時に使う) を行う際によく出てくるカプランマイヤー曲線を描いてみます。
カプランマイヤー曲線は生存率の推定値を表しており、曲線を比較することで議論をします。
Pythonで描いていた時はlifelines

lifelines.readthedocs.io

をよく使っていました。グラフ作成を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)

risk table 付き

カプランマイヤー曲線とリスク表の大きさの比率を変えてみる。

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")))

tableのフォントも変更

感想

他にも色々いじれそうだけど、短時間で分かったのはこの辺りです。 また分かったら追記しようと思います。