R 创建用于生存分析的审查DV(长格式)

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

另一个新手问题

我正在做一个项目,需要我使用生存分析。具体地说,我需要使用离散单位生存分析(所以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