使用 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!
我正在使用 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!