当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R cox.pht 具有时变协变量的可加 Cox 比例风险模型


R语言 cox.pht 位于 mgcv 包(package)。

说明

cox.ph 系列仅允许每个主题使用一组协变量值。如果每个受试者都有多个随时间变化的协变量测量值,那么仍然可以通过等效的泊松模型拟合比例风险回归模型。该配方由 Whitehead (1980) 提供,在平滑加法情况下同样有效。它的缺点是等效的泊松数据集可能非常大。

诀窍是在每个非审查事件时间为风险集中的每个受试者生成人工泊松观察。每个受试者对应的协变量值是事件发生时的值,而除了当时经历事件的受试者之外,所有受试者的泊松响应均为零(这对应于 Peto 对关系的校正)。模型的线性预测器必须包括每个事件时间的截距(这些指数的累积和是基线危险的 Breslow 估计)。

下面是对 survival 包中的 pbcseq 数据使用此技巧的一些示例代码。它使用 bamdiscrete=TRUE 选项配合以提高效率:执行此操作涉及一些近似值,并且通过将 gammethod="REML" 一起使用来获得与 cox.ph 中所做的完全相同的结果(花费了下面示例的许多倍的计算时间)。另一种方法是使用分层 Cox PH 将模型拟合为条件 Logistic 模型,并以事件时间作为分层(参见示例)。这在未受惩罚的情况下是相同的,但平滑参数估计可能不同。

示例代码中的函数 tdpois 对协变量使用粗略的分段常量插值,其中事件时间的协变量值被视为前一次测量的值。显然,更复杂的插值方案可能更可取。

例子

require(mgcv);require(survival)

## First define functions for producing Poisson model data frame

app <- function(x,t,to) {
## wrapper to approx for calling from apply...
  y <- if (sum(!is.na(x))<1) rep(NA,length(to)) else
       approx(t,x,to,method="constant",rule=2)$y
  if (is.factor(x)) factor(levels(x)[y],levels=levels(x)) else y
} ## app

tdpois <- function(dat,event="z",et="futime",t="day",status="status1",
                                                             id="id") {
## dat is data frame. id is patient id; et is event time; t is
## observation time; status is 1 for death 0 otherwise;
## event is name for Poisson response.
  if (event %in% names(dat)) warning("event name in use")
  require(utils) ## for progress bar
  te <- sort(unique(dat[[et]][dat[[status]]==1])) ## event times
  sid <- unique(dat[[id]])
  inter <- interactive()
  if (inter) prg <- txtProgressBar(min = 0, max = length(sid), initial = 0,
         char = "=",width = NA, title="Progress", style = 3)
  ## create dataframe for poisson model data
  dat[[event]] <- 0; start <- 1
  dap <- dat[rep(1:length(sid),length(te)),]
  for (i in 1:length(sid)) { ## work through patients
    di <- dat[dat[[id]]==sid[i],] ## ith patient's data
    tr <- te[te <= di[[et]][1]] ## times required for this patient
    ## Now do the interpolation of covariates to event times...
    um <- data.frame(lapply(X=di,FUN=app,t=di[[t]],to=tr))
    ## Mark the actual event...
    if (um[[et]][1]==max(tr)&&um[[status]][1]==1) um[[event]][nrow(um)] <- 1 
    um[[et]] <- tr ## reset time to relevant event times
    dap[start:(start-1+nrow(um)),] <- um ## copy to dap
    start <- start + nrow(um)
    if (inter) setTxtProgressBar(prg, i)
  }
  if (inter) close(prg)
  dap[1:(start-1),]
} ## tdpois

## The following typically takes a minute or less...


## Convert pbcseq to equivalent Poisson form...
pbcseq$status1 <- as.numeric(pbcseq$status==2) ## death indicator
pb <- tdpois(pbcseq) ## conversion
pb$tf <- factor(pb$futime) ## add factor for event time

## Fit Poisson model...
b <- bam(z ~ tf - 1 + sex + trt + s(sqrt(protime)) + s(platelet)+ s(age)+
s(bili)+s(albumin), family=poisson,data=pb,discrete=TRUE,nthreads=2)

pb$dumt <- rep(1,nrow(pb)) ## dummy time
## Fit as conditional logistic... 
b1 <- gam(cbind(dumt,tf) ~ sex + trt + s(sqrt(protime)) + s(platelet)
+ s(age) + s(bili) + s(albumin),family=cox.ph,data=pb,weights=z)

par(mfrow=c(2,3))
plot(b,scale=0)

## compute residuals...
chaz <- tapply(fitted(b),pb$id,sum) ## cum haz by subject
d <- tapply(pb$z,pb$id,sum) ## censoring indicator
mrsd <- d - chaz ## Martingale
drsd <- sign(mrsd)*sqrt(-2*(mrsd + d*log(chaz))) ## deviance

## plot survivor function and s.e. band for subject 25
te <- sort(unique(pb$futime)) ## event times
di <- pbcseq[pbcseq$id==25,] ## data for subject 25
pd <- data.frame(lapply(X=di,FUN=app,t=di$day,to=te)) ## interpolate to te
pd$tf <- factor(te)
X <- predict(b,newdata=pd,type="lpmatrix")
eta <- drop(X%*%coef(b)); H <- cumsum(exp(eta))
J <- apply(exp(eta)*X,2,cumsum)
se <- diag(J%*%vcov(b)%*%t(J))^.5
plot(stepfun(te,c(1,exp(-H))),do.points=FALSE,ylim=c(0.7,1),
     ylab="S(t)",xlab="t (days)",main="",lwd=2)
lines(stepfun(te,c(1,exp(-H+se))),do.points=FALSE)
lines(stepfun(te,c(1,exp(-H-se))),do.points=FALSE)
rug(pbcseq$day[pbcseq$id==25]) ## measurement times

参考

Whitehead (1980) Fitting Cox's regression model to survival data using GLIM. Applied Statistics 29(3):268-275

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Additive Cox proportional hazard models with time varying covariates。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。