コックス回帰分析(Cox Regression Analysis)のメモ。
【目次】
コックス回帰分析はハザード関数を目的変数とした回帰分析手法。コックス比例ハザードモデル、比例ハザードモデルなどとも呼ばれる。
任意の共変量(説明変数)を投入することができるセミパラメトリックモデル。
コックス回帰分析の回帰係数を指数変換したものはハザード比(Hazard Ratio、HR)。
ロジスティクス回帰の回帰係数を指数変換したものはオッズ比。
計算式等
■ ハザード関数
(イメージ図、離散値の場合)
* 死亡関数 F(t)=時点tまでにイベント発生する確率
* 生存関数 S(t)=時点t以降も生存している(イベント発生しない)確率。
* ハザード関数 H(t)=時点tの直前まで生存している集団(リスク集団、Number At Risk)のうち、時点tでイベント発生する確率
ハザード関数、生存関数、死亡関数、確率密度関数・・・などの関係性は 別記事 にまとめている。
■ コックス回帰分析モデル
は、ベースラインハザード関数(baseline hazard function)と呼ばれ、時点tのみに依存するノンパラメトリックな部分(共変量に依存しない潜在因子)。
は、相対危険度関数(relative risk function)と呼ばれ、時点tに依存しないパラメトリックな部分。
ベースラインハザード関数は推定不要。
例えば、治療群(治療A=1、治療B=0)を共変量としたとき、ハザード比(基準:治療B)は次のとおりで、導出の過程でベースラインハザード関数は打ち消される。
この例ではハザード比は exp{β1} となる。
(治療Aのイベント発生リスクは、治療Bと比べて exp{β1} 倍高まると解釈される。)
なお、コックス回帰分析は「ハザード比が時間に依存せず一定だ」という仮定(比例ハザード性)の上に成り立つ。
つまり、相対危険度関数は時点tに依存しないという強い仮定が必要。
上記の例では、治療群の影響は時間に依存せず一定という仮定となり、1年後に治療群の影響が逆転したら解釈が難しくなる。
■ 比例ハザード性の評価
① Schoenfeld残差プロットによる評価
縦軸:Schoenfeld残差(シェーンフィールド残差)、横軸:時間のプロット。
平滑化曲線に時間依存的な変化がなければ比例ハザード性を否定しない。
Rの cox.zph
では、Schoenfeld残差を用いた比例ハザード性の検定(Schoenfeld Individual Test)ができる。
「帰無仮説:比例ハザード性を満たす」「対立仮説:比例ハザード性を満たさない」の仮説の下、p値が非有意で帰無仮説を棄却できなければ、比例ハザード性を否定しない。
② 二重対数プロット(log-logプロット)による評価
縦軸:log(-log S(t))、横軸:時間のプロット。
群間のプロットが平行で時間依存性がなければ、比例ハザード性を否定しない。
累積ハザード関数と累積生存率の関係は以下。
■ 残差診断
martingale残差(マルチンゲール残差)、Schoenfeld残差(シェーンフィールド残差)などの複数の方法が提案されている。
Rでの実行
以前のKaplan-meierと同じく、MASS
ライブラリーのgehan
データでコックス回帰を実施してみる。
【統計】生存時間解析 カプランマイヤー法(Kaplan-meier method) - こちにぃるの日記
library(MASS) library(survival) library(survminer) ADTTE <- data.frame( AVAL = gehan$time ,EVENT = gehan$cens ,CNSR = ifelse(gehan$cens==0, 1, 0) #-- イベント=0, 打ち切り>0の形式 ,TRT01A = factor(gehan$treat, levels=c("control","6-MP")) ) #-- Kaplan-meier plot KM1 <- survfit(formula = Surv(time=AVAL, event=EVENT) ~ TRT01A ,conf.type = "log-log" ,conf.int = .95 ,type = "kaplan-meier" ,error = "greenwood" ,data = ADTTE) ggsurvplot(KM1 ,pval = TRUE ,conf.int = TRUE ,risk.table = TRUE ,risk.table.col = "strata" ,linetype = "strata" ,surv.median.line = "hv" ,ggtheme = theme_bw() ,palette = c("blue", "darkgreen") )
死亡を目的変数、治療群(Control vs. 6-MP)を共変量としたコックス回帰を実行。
Control群を基準としたハザード比は 0.2076 で、信頼区間 (0.09251, 0.4659) は1を挟まず、治療群に有意差が見られる。
> COX1 <- coxph(Surv(time=AVAL, event=EVENT) ~ TRT01A, ADTTE, ties="efron") > summary(COX1) Call: coxph(formula = Surv(time = AVAL, event = EVENT) ~ TRT01A, data = ADTTE, ties = "efron") n= 42, number of events= 30 coef exp(coef) se(coef) z Pr(>|z|) TRT01A6-MP -1.5721 0.2076 0.4124 -3.812 0.000138 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 exp(coef) exp(-coef) lower .95 upper .95 TRT01A6-MP 0.2076 4.817 0.09251 0.4659 Concordance= 0.69 (se = 0.041 ) Likelihood ratio test= 16.35 on 1 df, p=5e-05 Wald test = 14.53 on 1 df, p=1e-04 Score (logrank) test = 17.25 on 1 df, p=3e-05
Schoenfeld残差プロットを作成し、比例ハザード性を評価する。
平滑化曲線に時間依存的な変化は見られず、かつ比例ハザード性の検定(Schoenfeld Individual Test)も非有意であるため、比例ハザード性は否定されない。
cox.zph1 <- cox.zph(COX1) ggcoxzph(cox.zph1)

二重対数プロット(log-logプロット)でも比例ハザード性を評価してみる。
治療群間のプロットは平行で時間依存性は見られないため、本プロットでも比例ハザード性は否定されない。
ggsurvplot(KM1, fun="cloglog")

マルチンゲール残差とその標準化残差を用いて残差プロットを作成する。
0を中心にばらつき、明らかな偏りは見られない。(マルチンゲール残差は上限:1、下限:-∞)
scatter.smooth(residuals(COX1, type="martingale")) scatter.smooth(residuals(COX1, type="deviance"))


プログラムコード
library(MASS) library(survival) library(survminer) #-- Cox回帰 COX1 <- coxph(Surv(time=AVAL, event=EVENT) ~ covariate, ADTTE, ties="efron") summary(COX1) ##-- Schoenfeld残差プロット&比例ハザード性の検定(Schoenfeld Individual Test) cox.zph1 <- cox.zph(COX1) ggcoxzph(cox.zph1) ##-- 二重対数プロット(log-logプロット) KM1 <- survfit(Surv(time=AVAL, event=EVENT) ~ TRT01A ,conf.type = "log-log" ,conf.int = .95 ,type = "kaplan-meier" ,error = "greenwood" ,data = ADTTE) ggsurvplot(KM1, fun="cloglog") ##-- 残差診断 scatter.smooth(residuals(COX1, type="martingale"))
タイの計算は "efron","breslow","exact" の3つ。デフォルトはefron。
残差診断は type で "martingale","deviance","schoenfeld" など指定。
proc phreg data=ADTTE plots(overlay)=(cumhaz survival) ; class covariate(ref="XXX") / param=glm ; model AVAL * CNSR(1) = covariate / rl ties=exact; hazardratio covariate / cl=wald ; baseline out=COX1 survival=all cumhaz=all ; output out=COX2 atrisk=AtRisk survival=SURVIVAL resmart=RESMART resdev=RESDEV ressch=all ; id SUBJID ; run;タイの計算は "efron","breslow","exact" など。
OUTPUTオプションで残差出力。resmart:martingale、resdev:deviance、ressch:schoenfeld。
Python
整備中
参考
統計学(出版:東京図書), 日本統計学会編
https://opencommons.uconn.edu/cgi/viewcontent.cgi?article=8400&context=dissertations
https://waidai-csc.jp/updata/2018/08/seminar-igaku-20171222.pdf
http://www.stat.columbia.edu/~madigan/G6101/notes/survival4