我正在观察周末可能对个人生存的影响,因此我试图将我的数据转换为时间相关的结构,每个区间有一行。它可能是具有DschDT(放电日期)作为审查日期的Cox PH模型。患者出院(右侧被检查)或在医院内死亡。
数据看起来像这样,其中DIH是我的审查变量(0,1)
`structure(list(Age = c(28L, 77L, 92L, 28L, 59L, 7L), Sex = structure(c(1L,
2L, 1L, 1L, 2L, 2L), .Label = c("F", "M"), class = "factor"),
Care.type = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Acute",
"Organ.Procurement", "Geriatric.Eval.Mgt", "Psychogeriatric",
"Maintenance", "Rehab", "Palliative"), class = "factor"),
AdmDT = structure(c(1396282680, 1396311600, 1396329780, 1396331040,
1396343940, 1396348080), class = c("POSIXct", "POSIXt"), tzone = ""),
DschgDT = structure(c(1396288800, 1396335600, 1397721600,
1396338600, 1396390200, 1396359120), class = c("POSIXct",
"POSIXt"), tzone = ""), DIH = c(0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("Age",
"Sex", "Care.type", "AdmDT", "DschgDT", "DIH"), row.names = c(1L,
7L, 8L, 9L, 10L, 11L), class = "data.frame")`
例如,我可能有一名患者在星期三住院,并在下周四出院。在这种情况下,该患者事件将有三行。一个用于周三至周五,一个用于周六至周日,一个用于周一至周四,全包。
我已设法使用此功能识别一段时间内的周末。
getDuration <- function(d1, d2,fmt="%Y-%m-%d %H%M") {
myDays <- seq.Date(to = as.Date(d2, format=fmt),
from = as.Date(d1, format =fmt),
by = 1)
myDays[which(is.weekend(myDays))]
}
dat<-mapply(getDuration,AdmDT,DschgDT)
> head(clip)
ID StartDate EndDate Start Time Event WeekendStart1 WeekendEnd1 WeekendStart2 WeekendEnd2
1 1 9/08/2013 16/08/2013 0 7 0 1 3 0 0
2 2 9/12/2013 12/12/2013 0 3 0 0 0 0 0
3 3 9/01/2014 17/01/2014 0 8 1 2 4 0 0
在确定了各个日期之间的周末之后,我想根据周末分配时间。对于此示例,结果数据如下所示:
clip2
ID StartDate EndDate Start Time Event Weekend
1 1 9/08/2013 16/08/2013 0 1 0 0
2 1 9/08/2013 16/08/2013 1 3 0 1
3 1 9/08/2013 16/08/2013 3 7 0 0
4 2 9/12/2013 12/12/2013 0 3 0 0
5 3 9/01/2014 17/01/2014 0 2 0 0
6 3 9/01/2014 17/01/2014 2 4 0 1
7 3 9/01/2014 17/01/2014 4 8 1 0
但是我似乎无法找到一种方法来有效地分割时间间隔survSplit
和tmerge
来自survival
包似乎没有有这样的功能。
任何人都可以给我一些想法,除了运行一个大丑陋的循环?
更新。好吧,经过大量的努力,我设法做到了。对于那些有兴趣的人。 该功能可以找到医院认为的周末,即。从周五晚开始到周一早上结束。当然你可以编辑以适应。 此函数返回星期五和星期日,以便您可以在这些天分割。
is.weekend<-function (x)
{
library(chron)
if (!inherits(x, "dates"))
x<-as.chron(as.character(x))
v <- month.day.year(x)
h<-hours(x)
out <- day.of.week(v$month, v$day, v$year) + 1
# 1 is Sunday and 7 is Saturday, h is hours
x<-((out == 6 & h >= 18) | out==7|out==1|(out == 2 & h < 6))
return(x)
}
这是上面更简单的版本来获取间隔
基本功能,用于识别周六开始和周日结束的周末数。 d1和d2分别为入院和出院日期/时间。
getDuration <- function(d1, d2) {
myDays <- seq(d1,d2,by="hour")
myDays[which(is.weekend(myDays))]
}
此函数为每条记录生成时间序列
survSeq.dh<-function(a,w){
aa<-sort(c(a,as.POSIXct(w)))
aa<-diff(aa)
units(aa)<-"hours"
aa<-as.numeric(aa)
aa<-cumsum(aa)
#Identify the start and end of weekends
aa1<-which(diff(aa)!=1)
aa1<-sort(c(aa1,aa1+1))
aa1<-c(aa[1],aa[aa1],aa[length(aa)])/24
}
一点管家
#Make a survSplit object
#Create a start and stop time
dat$start<-0
dat$time<-as.numeric(dat$separation_datetime-dat$admission_datetime)/(60*24)
Event variable
dat$DIH<-dat$mode_of_separation=="Died in hospital"
最新版本的survival :: survSplit会创建一个Surv对象,这会大大减慢这个过程,所以我使用旧版本。
生存包2.39-2中新的survSplit功能太慢了。
survSplit2<-function (data, cut, end, event, start, id = NULL, zero = 0,
episode = NULL)
{
cut <- sort(cut)
ntimes <- length(cut)
n <- nrow(data)
newdata <- lapply(data, rep, ntimes + 1)
endtime <- rep(c(cut, Inf), each = n)
eventtime <- newdata[[end]]
if (start %in% names(data))
starttime <- data[[start]]
else starttime <- rep(zero, length.out = n)
starttime <- c(starttime, pmax(starttime, rep(cut, each = n)))
epi <- rep(0:ntimes, each = n)
status <- ifelse(eventtime <= endtime & eventtime > starttime,
newdata[[event]], 0)
endtime <- pmin(endtime, eventtime)
drop <- starttime >= endtime
newdata <- do.call("data.frame", newdata)
newdata[, start] <- starttime
newdata[, end] <- endtime
newdata[, event] <- status
if (!is.null(id))
newdata[, id] <- rep(rownames(data), ntimes + 1)
if (!is.null(episode))
newdata[, episode] <- epi
newdata <- newdata[!drop, ]
newdata
}
然后在脚本中运行
查找每个患者记录的周末/下班后持续时间
xx.s<-mapply(getDuration,dat$admission_datetime,dat$separation_datetime))
定义每个周末逗留的开始和停止时间
xx.surv<-mapply(survSeq,dat$admission_datetime,xx.s)
将地段放入循环(对不起)
lengthx<-dim(dat)[1]
dat.l<-list()
for(i in 1:lengthx){
print(i)
dat.l[[i]]<-survSplit2(dat[i,],cut=xx.surv[[i]],end="time",start="start",event="DIH")
}
library(data.table)
dat.l<-data.frame(rbindlist(dat.l))
所以现在我有了一种开发时间依赖模型的基础,这种模式允许患者住院时在周末和工作日之间交替进行危险功能切换。
e.g。 coxph(监测网(开始,时间,DIH)〜星期几)