web-dev-qa-db-ja.com

survreg(Rのパッケージ生存)によって生成された生存曲線をプロットする方法は?

ワイブルモデルを生存データに適合させてプロットしようとしています。データには、2006年から2010年まで実行される1つの共変量、コホートしかありません。それでは、2010年のコホートの生存曲線をプロットするために続く2行のコードに何を追加するかについてのアイデアはありますか?

library(survival)
s <- Surv(subSetCdm$dur,subSetCdm$event)
sWei <- survreg(s ~ cohort,dist='weibull',data=subSetCdm)

Cox PHモデルで同じことを達成することは、次のように、かなり単純です。問題は、survfit()がタイプsurvregのオブジェクトを受け入れないことです。

sCox <- coxph(s ~ cohort,data=subSetCdm)
cohort <- factor(c(2010),levels=2006:2010)
sfCox <- survfit(sCox,newdata=data.frame(cohort))
plot(sfCox,col='green')

(サバイバルパッケージの)データ肺を使用して、ここで私が達成しようとしています。

#create a Surv object
s <- with(lung,Surv(time,status))

#plot kaplan-meier estimate, per sex
fKM <- survfit(s ~ sex,data=lung)
plot(fKM)

#plot Cox PH survival curves, per sex
sCox <- coxph(s ~ as.factor(sex),data=lung)
lines(survfit(sCox,newdata=data.frame(sex=1)),col='green')
lines(survfit(sCox,newdata=data.frame(sex=2)),col='green')

#plot weibull survival curves, per sex, DOES NOT RUN
sWei <- survreg(s ~ as.factor(sex),dist='weibull',data=lung)
lines(survfit(sWei,newdata=data.frame(sex=1)),col='red')
lines(survfit(sWei,newdata=data.frame(sex=2)),col='red')
27
rm.

これが役に立って、私が誤解を招くような間違いを犯していないことを願っています:

上からコピー:

    #create a Surv object
    s <- with(lung,Surv(time,status))

    #plot kaplan-meier estimate, per sex
    fKM <- survfit(s ~ sex,data=lung)
    plot(fKM)

    #plot Cox PH survival curves, per sex
    sCox <- coxph(s ~ as.factor(sex),data=lung)
    lines(survfit(sCox,newdata=data.frame(sex=1)),col='green')
    lines(survfit(sCox,newdata=data.frame(sex=2)),col='green')

ワイブルの場合、Vincentからのコメントをredictで使用します。

    #plot weibull survival curves, per sex,
    sWei <- survreg(s ~ as.factor(sex),dist='weibull',data=lung)

    lines(predict(sWei, newdata=list(sex=1),type="quantile",p=seq(.01,.99,by=.01)),seq(.99,.01,by=-.01),col="red")
    lines(predict(sWei, newdata=list(sex=2),type="quantile",p=seq(.01,.99,by=.01)),seq(.99,.01,by=-.01),col="red")

plot output

ここでの秘訣は、プロットと予測の分位数の順序を逆にすることでした。これを行うためのより良い方法がおそらくありますが、それはここで動作します。幸運を!

22
tim riffe

別のオプションは、パッケージflexsurvを利用することです。これはsurvivalパッケージにいくつかの追加機能を提供します-パラメトリック回帰関数flexsurvreg()があなたが求めることを実行する素敵なプロットメソッドを持っていることを含みます。

上記の肺の使用;

#create a Surv object
s <- with(lung,Surv(time,status))

require(flexsurv)
sWei  <- flexsurvreg(s ~ as.factor(sex),dist='weibull',data=lung)
sLno  <- flexsurvreg(s ~ as.factor(sex),dist='lnorm',data=lung)   

plot(sWei)
lines(sLno, col="blue")

output from plot.flexsurvreg

type引数を使用して累積ハザードまたはハザードスケールでプロットし、ci引数を使用して信頼区間を追加できます。

15
peedeerich

これは、次のコードを使用する Tim Riffeの回答 を明確にするメモにすぎません。

_lines(predict(sWei, newdata=list(sex=1),type="quantile",p=seq(.01,.99,by=.01)),seq(.99,.01,by=-.01),col="red")
lines(predict(sWei, newdata=list(sex=2),type="quantile",p=seq(.01,.99,by=.01)),seq(.99,.01,by=-.01),col="red")
_

2つの鏡像シーケンスseq(.01,.99,by=.01)seq(.99,.01,by=-.01)の理由は、predict()メソッドがイベント分布の分位数を与えるためですf(t)-つまり、f(t)-の逆CDFの値は、生存曲線が1-(fのCDF)対tをプロットしている間です。つまり、 pとpredict(p)を比較すると、CDFが得られ、1-pとpredict(p)をプロットすると、生存曲線(1-CDF)が得られます。次のコードは、より透過的で一般化して任意のp値のベクトル:

_pct <- seq(.01,.99,by=.01)
lines(predict(sWei, newdata=list(sex=1),type="quantile",p=pct),1-pct,col="red")
lines(predict(sWei, newdata=list(sex=2),type="quantile",p=pct),1-pct,col="red")
_
7
Paul