【初心者向け】超簡単!カプランマイヤー曲線の書き方と解析!
【初心者向け】超簡単!カプランマイヤー曲線の書き方と解析!

【初心者向け】超簡単!カプランマイヤー曲線の書き方と解析!

こんにちは。ほしのはやしです。臨床系のデータを扱う場合、カプランマイヤー曲線が必須になること、多いですよね。 このページではR studioでカプランマイヤー曲線(生存曲線など)を書く方法と統計解析について解説します! カプランマイヤー曲線

例えば、ある抗がん剤の治療効果を評価する場合、がんによる死亡だけでなく、治療に伴う副作用による死亡も起こり得ます。この時、がんによる死亡が起きる前に、副作用によって患者さんが亡くなってしまうと、その患者さんについては抗がん剤の治療効果を評価することができなくなります。つまり、 副作用による死亡が「競合リスク」となる のです。このような競合リスクの存在を考慮せずに分析を行うと、治療効果を過小評価したり、逆に過大評価したりする可能性があります。

右側打ち切り、左側打ち切りって?

ずばり言いましょう。 臨床研究をする場合は、ほとんど右側打ち切りだけなので気にしなくて大丈夫 です!

右側打ち切りとは、観察開始より後で打ち切りが起きた場合で、先程の例や観察期間終了 が含まれます。 左側打ち切りとは、観察開始より前で打ち切りが起きた場合 で、例えばある薬を投与してからの心筋梗塞発生までの日数を調べたい場合、ランダム化して薬を投与するまでに心筋梗塞発症した場合になります。

R studioにおける打ち切りデータの入力の仕方

R studioの場合は、0(打ち切り(右側))、1(イベント発生)、3(左側打ち切り) 、となっていますので、データ入力の場合は、0か1を入力しておくと良いです。

具体的なコード(R studio)

とても便利な survminer というパッケージをインストールしておいてください。パッケージのインストール方法はこちら!

【初心者向け】R studioのおすすめパッケージとインストール方法 | 天の海 雲の波 こんにちは。ほしのはやしです。R studioをインストールしたけれど、その後どうすればよいか途方にくれてしまうことありますよね。 特にRを使い始めたばかりの初心者にとっ…

テーブル名:datasheet1

AgeSexPFS_timePFS_censoreStageIntervention65M781IPlacebo70F801IVDrugA62M1450IIDrugA81M501IIIDrugA76F551IPlacebo77F1231IVPlacebo………………

基本の構文は以下になります!survfit(Surv( 時間の列名 , 打ち切りの列名 ) ~ 群分けの列名 , データシート名)

library(survival) library(survminer) fit1 survfit(Surv(PFS_time, PFS_censore) ~ Intervention, datasheet1) ggsurvplot(fit1) library(survival) library(survminer) fit1 survfit(Surv(PFS_time, PFS_censore) ~ Intervention, datasheet1) ggsurvplot( fit1, pval = TRUE, risk.table = TRUE, palette = c("blue","red"), censor.shape = "|", legend.title = "Intervention", legend.lab = c("Drug A", "Placebo"), xlab = "Days since intervention", ylab = "Probability of PFS" )

ここで出るP値はログランク検定で計算されたものになるよ

Medianと95%CIは、先程のコードのあとに fit1 とうつだけで確認できます!

fit1

イベントまでの期間の統計解析(生存期間の統計解析)

統計で使う検定は?

ログランク検定(Log-rank検定) になります。これは2群以上の比較において使えるノンパラメトリック検定になります。

具体的なコード(R studio) library(survival) library(survminer) res2 survdiff(Surv(PFS_time, PFS_censore) ~ Intervention, datasheet1) print(res2, digit = 4)

print(結果のデータ, digit = 数字)小数点何桁 まで表示するか決定できます!

3群以上を比較する場合(pairwise_survdiff)

3群以上の場合は、False discovery rate(FDR)の調整が必要になります。以下のコードを覚えて守られば大丈夫です!

library(survival) library(survminer) res3 pairwise_survdiff(Surv(PFS_time, PFS_censore) ~ Intervention, datasheet1, p.adjust.method = "holm") print(res3, digit = 4)

カプランマイヤー曲線でサブグループ解析

カテゴリー因子でサブグループ解析

すでにカテゴリー化されている Sex についてサブグループ解析をする方法です。

テーブル名:datasheet1

AgeSexPFS_timePFS_censoreStageIntervention65M781IPlacebo70F801IVDrugA62M1450IIDrugA81M501IIIDrugA76F551IPlacebo77F1231IVPlacebo……………… library(survival) library(survminer) fit1 survfit(Surv(PFS_time, PFS_censore) ~ Intervention, datasheet1) ggsurvplot( fit1, palette = c("blue", "red"), censor.shape = "|", legend.title = "Intervention", legend.lab = c("Drug A", "Placebo"), xlab = "Days since intervention", ylab = "Probability of PFS", facet.by = "Sex" # ここにサブグループになる変数を指定 )

survminerのパッケージを使って、最後に facet.by =”サブグループ解析したい列名” を入れることで簡単にできます!

記事執筆時点では、層別化に リスクテーブル(risk.table = TRUE)P値(pval = TRUE) を入れるとエラーが出ますので注意が必要です!

連続変数(年齢など)を層別化してサブグループ解析

年齢など 連続した数値をサブグループ解析するためには、適当なグループに分類する必要 があります。

datasheet1$Age_group ifelse(datasheet1$Age >= 65, "≥ 65 yr", "< 65 yr") library(survival) library(survminer) fit1 survfit(Surv(PFS_time, PFS_censore) ~ Intervention, datasheet1) ggsurvplot( fit1, palette = c("blue", "red"), censor.shape = "|", legend.title = "Intervention", legend.lab = c("Drug A", "Placebo"), xlab = "Days since intervention", ylab = "Probability of PFS", facet.by = "Age_group" # ここにサブグループになる変数を指定 )

まとめ

URLをコピーしました!
  • 【初心者向け】Table 1はgtsummaryで一発作成!具体例で使い方説明!
  • 【初心者向け】多変量解析:R studioでやる重回帰分析の具体的な方法

この記事を書いた人

柴犬をこよなく愛する読書家。 街歩きとお菓子作りを趣味にしています。 研究や論文に役立つ情報をわかりやすくお伝えします。