R 创建用于生存分析的审查DV(长格式)
另一个新手问题 我正在做一个项目,需要我使用生存分析。具体地说,我需要使用离散单位生存分析(所以Cox回归或其他假设我的DV是连续的方法是不可能的) 我已经将我的数据集转换为长格式,我需要通过(步骤1)查找变量(“q”)=1的最后一次来创建一个经过审查的DV(“DV”);(步骤2)在时间+1时将我的“dv”重新编码为“0”;(步骤3)在时间+2…n时将我的“dv”重新编码为“NA”;(步骤4)删除“dv”=NA时的所有观察值(行) 在我这样做之前,我似乎应该创建一个默认分配给“1”的DV。步骤3之后,我的数据如下所示:R 创建用于生存分析的审查DV(长格式),r,R,另一个新手问题 我正在做一个项目,需要我使用生存分析。具体地说,我需要使用离散单位生存分析(所以Cox回归或其他假设我的DV是连续的方法是不可能的) 我已经将我的数据集转换为长格式,我需要通过(步骤1)查找变量(“q”)=1的最后一次来创建一个经过审查的DV(“DV”);(步骤2)在时间+1时将我的“dv”重新编码为“0”;(步骤3)在时间+2…n时将我的“dv”重新编码为“NA”;(步骤4)删除“dv”=NA时的所有观察值(行) 在我这样做之前,我似乎应该创建一个默认分配给“1”的DV。步骤3
id time q dv
1 1 1 1
1 2 0 1
1 3 1 1
1 4 0 0
1 5 0 NA
1 6 0 NA
2 1 1 1
2 2 1 1
2 3 0 0
2 4 0 NA
2 5 0 NA
2 6 0 NA
请注意,随着时间的推移,“q”可以在“0”或“1”之间变化(参见时间=2时id=1的观察),但由于生存分析的性质,“dv”不能。我需要做的是创建一个变量,找到“q”最后一次在“1”和“0”之间变化的时间,然后相应地进行审查。步骤4之后,我的数据应该如下所示:
id time q dv
1 1 1 1
1 2 0 1
1 3 1 1
1 4 0 0
2 1 1 1
2 2 1 1
2 3 0 0
感谢所有可能的帮助 这比预期的要详细,但它可以为您完成长格式代码段的工作: 我从提供的数据开始,但使用宽而不是长
zz <- textConnection("id time q dv
1 1 1 1
1 2 0 1
1 3 1 1
1 4 0 0
1 5 0 NA
1 6 0 NA
2 1 1 1
2 2 1 1
2 3 0 0
2 4 0 NA
2 5 0 NA
2 6 0 NA
")
d <- read.table(zz, header = TRUE)
d$dv <- NULL
close(zz)
# start out with wide instead of long
dw <- reshape(d, direction='wide', timevar="time", sep="")
dw
使用每宽行/观测值生成适当“dv”变量的函数
censor <- function(periods) {
n <- length(periods)
cperiods <- periods*1:n # multiply to get positions
n.obs <- max(cperiods) # position of last q=1, and one q=0
periods[(n.obs+1):n] <- NA # NA's for periods outside observed range
n.cens <- n - n.obs - 1 # number censored
c(rep(1, n.obs-1), 0, rep(NA, n.cens+1)) # fill "dv" accordingly
}
现在回到长格式(具有美观的格式、顺序等)
假设
dv
是DTSA中的事件发生,您确定概述的步骤是最实用的方法吗?原始(广域)数据是什么样子的?虽然我不是专家,但从我所做的阅读来看,我认为它们是。每个问题还具有时变属性,这些属性将用作模型中的预测因子,并且随着时间的变化,需要较长的格式。较长的格式是您的生存模型所需要的,而不是录制工作所必需的。。。然而,我试了一下,见下文。
censor <- function(periods) {
n <- length(periods)
cperiods <- periods*1:n # multiply to get positions
n.obs <- max(cperiods) # position of last q=1, and one q=0
periods[(n.obs+1):n] <- NA # NA's for periods outside observed range
n.cens <- n - n.obs - 1 # number censored
c(rep(1, n.obs-1), 0, rep(NA, n.cens+1)) # fill "dv" accordingly
}
# apply censored(), create dv variable in wide format
dw.censored <- data.frame(t(apply(dw, 1, FUN = censor)))
dw.censored
## X1 X2 X3 X4 X5 X6 X7
## 1 1 1 1 0 NA NA NA
## 7 1 1 0 NA NA NA NA
dl.censored <- reshape(dw.censored, varying = 1:7, timevar = "time",
sep = "", direction = "long")
dl.censored <- dl.censored[order(dl.censored$id, dl.censored$time),]
dl.censored$dv <- dl.censored$X
rownames(dl.censored) <- dl.censored$X <- NULL
dl.censored
## time id dv
## 1 1 1 1
## 2 2 1 1
## 3 3 1 1
## 4 4 1 0
## 5 5 1 NA
## 6 6 1 NA
## 7 7 1 NA
## 8 1 2 1
## 9 2 2 1
## 10 3 2 0
## 11 4 2 NA
## 12 5 2 NA
## 13 6 2 NA
## 14 7 2 NA
dl.censored <- na.omit(dl.censored) # without NA's
dl.censored
## time id dv
## 1 1 1 1
## 2 2 1 1
## 3 3 1 1
## 4 4 1 0
## 8 1 2 1
## 9 2 2 1
## 10 3 2 0