使用 R 中的新对象列表更新 msfit 对象 class

Updating a msfit object class using a new list of objects in R

我正在使用 mstate 包中的 msfit 函数来 predict/fit 新数据的累积转换风险。然后我想用一些新信息手动更新存储在 msfit 对象中的累积转换风险,但我被困在这里了。我正在使用 list 类型的操作来加快计算速度。这是一个示例代码,

library(mstate)
tmat <- trans.illdeath() # transition matrix for illness-death multistate model    
tg <- data.frame(illt=c(1,1,6,6,8,9),ills=c(1,0,1,1,0,1),
             dt=c(5,1,9,7,8,12),ds=c(1,1,1,1,1,1),
             x1=c(1,1,1,0,0,0),x2=c(6:1)) # creating a data for fitting

# converting data to long format using msprep
tglong <- msprep(time=c(NA,"illt","dt"),status=c(NA,"ills","ds"),
             data=tg,keep=c("x1","x2"),trans=tmat)
tglong <- expand.covs(tglong,c("x1","x2")) # expanding the covariate data
cx <- coxph(Surv(Tstart,Tstop,status)~x1.1+x2.2+strata(trans),
        data=tglong,method="breslow") # fitting coxph models
# Now preparing a newdata for fitting/ predicting 
newdata <- data.frame(id=c(rep(1,3),rep(2,3)),trans=rep(1:3,2),x1.1=rep(0,6),x2.2=c(rep(5,3),rep(4,3)),strata=rep(1:3,2))
# using msfit as list
fit_list<-lapply(1:max(newdata$id), function(x) return(msfit(cx, newdata = newdata[newdata$id==x,], trans = tmat)))

# storing the transition hazards into a new object
a<-lapply(1:length(fit_list), function(i) fit_list[[i]]$Haz)
# manually updating one of the transition hazards
a<-lapply(1:length(a), function(i) within(a[[i]], Haz <- ifelse(trans==3, Haz*2, Haz)))

现在我只想用新列表对象 a 更新存储在每个 fit_list 对象中的 Haz 数据框,并保持其余部分不变 msfit 对象。这是我所做的,

 fit_list<-lapply(1:length(a), function(i) {
 fit_list[[i]]$Haz<-a[[i]]
 })

这不会保留原始 msfit 对象,而是 returns Haz 的列表。但是如果没有列表,也就是说,如果 newdata 只包含一个 id (即 data.frame 类型的对象),它会起作用。我在 newdata 中设置了巨大的数据,使用 list 操作要快得多。谁能帮我解决这个问题?

This does not keep the original msfit object, rather returns a list of Haz.

当然,因为这就是你在编码时所做的事情

fit_list <- lapply(1:length(a),
                 function(i)
                 {
                       fit_list[[i]]$Haz <- a[[i]] 
                 })

这个returnsfit_list[[i]]$Haz作为一个列表保存到变量fit_list中。换句话说,您丢失了 fit_list 中保存的内容。只需将代码更改为

fit_list <- lapply(1:length(a),
       function(i)
       {
            fit_list[[i]]$Haz <- a[[i]]
            return(fit_list[[i]])
       })

它应该可以工作。

HTH!