生存分析的数据清理使用参与者自己的数据来估算值
Data Cleaning for Survival Analysis Using a Participant's Own Data to Impute Values
我正在为生存分析清理一些数据,我正在努力做到这一点,以便根据给定主题内的周围值估算缺失的数据。我想为参与者使用最接近的先前值和最接近的后续值的 mean。如果没有后续值,那么我想使用以前的值结转,直到出现后续值。
我一直在尝试将问题分解为更小、更易于管理的操作和对象,但是,我不断提出的解决方案迫使我使用基于缺失值上方和下方的行的条件格式,并且,坦率地说,我对如何做到这一点有点不知所措。如果您认为您知道我可以使用、试验的好技术,或者如果您知道我在查找解决方案时可以使用的任何好的搜索词,我希望得到一些指导。
详情如下:
#Fake dataset creation
id <- c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4)
time <-c(0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6)
ss <- c(2,2,4,3,NA,0,0,1,4,0,NA,0,0,0,4,2,1,3,3,2,NA,3,4,3,NA,NA,0,0)
mydat <- data.frame(id, time, ss)
*粗体和下划线字符代表上述数据集的变化
这里的目标是找到一种方法让 ID #1(变量 ss)的 NA 值看起来像这样:2,2,4,3,1.5 ,0,0
ID# 2(变量 ss)看起来像这样:1,4,0,0,0,0,0
ID #3(变量 ss)看起来像这样:4,2,1,3,3,2,NA(没有变化,因为带有 NA 的行最终会被删除)
ID #4(变量 ss)看起来像这样:3,4,3,3, 1.5,0,0(这个需要多次更改,我认为它是最难解决的)。
如果处理速度不是问题(我猜 "ID #4" 很难对插补进行矢量化),那么可以尝试:
f <- function(x) {
idx <- which(is.na(x))
for (id in idx) {
sel <- x[id+c(-1,1)]
if (id < length(x))
sel <- sel[!is.na(sel)]
x[id] <- mean(sel)
}
return(x)
}
cbind(mydat, ss_imp=ave(mydat$ss, mydat$id, FUN=f))
# id time ss ss_imp
# 11 1 0 2 2.0
# 12 1 1 2 2.0
# 13 1 2 4 4.0
# 14 1 3 3 3.0
# 15 1 4 NA 1.5
# 16 1 5 0 0.0
# 17 1 6 0 0.0
# 21 2 0 1 1.0
# 22 2 1 4 4.0
# 23 2 2 0 0.0
# 24 2 3 NA 0.0
# 25 2 4 0 0.0
# 26 2 5 0 0.0
# 27 2 6 0 0.0
# 31 3 0 4 4.0
# 32 3 1 2 2.0
# 33 3 2 1 1.0
# 34 3 3 3 3.0
# 35 3 4 3 3.0
# 36 3 5 2 2.0
# 37 3 6 NA NA
# 41 4 0 3 3.0
# 42 4 1 4 4.0
# 43 4 2 3 3.0
# 44 4 3 NA 3.0
# 45 4 4 NA 1.5
# 46 4 5 0 0.0
# 47 4 6 0 0.0
我正在为生存分析清理一些数据,我正在努力做到这一点,以便根据给定主题内的周围值估算缺失的数据。我想为参与者使用最接近的先前值和最接近的后续值的 mean。如果没有后续值,那么我想使用以前的值结转,直到出现后续值。
我一直在尝试将问题分解为更小、更易于管理的操作和对象,但是,我不断提出的解决方案迫使我使用基于缺失值上方和下方的行的条件格式,并且,坦率地说,我对如何做到这一点有点不知所措。如果您认为您知道我可以使用、试验的好技术,或者如果您知道我在查找解决方案时可以使用的任何好的搜索词,我希望得到一些指导。
详情如下:
#Fake dataset creation
id <- c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4)
time <-c(0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6)
ss <- c(2,2,4,3,NA,0,0,1,4,0,NA,0,0,0,4,2,1,3,3,2,NA,3,4,3,NA,NA,0,0)
mydat <- data.frame(id, time, ss)
*粗体和下划线字符代表上述数据集的变化
这里的目标是找到一种方法让 ID #1(变量 ss)的 NA 值看起来像这样:2,2,4,3,1.5 ,0,0
ID# 2(变量 ss)看起来像这样:1,4,0,0,0,0,0
ID #3(变量 ss)看起来像这样:4,2,1,3,3,2,NA(没有变化,因为带有 NA 的行最终会被删除)
ID #4(变量 ss)看起来像这样:3,4,3,3, 1.5,0,0(这个需要多次更改,我认为它是最难解决的)。
如果处理速度不是问题(我猜 "ID #4" 很难对插补进行矢量化),那么可以尝试:
f <- function(x) {
idx <- which(is.na(x))
for (id in idx) {
sel <- x[id+c(-1,1)]
if (id < length(x))
sel <- sel[!is.na(sel)]
x[id] <- mean(sel)
}
return(x)
}
cbind(mydat, ss_imp=ave(mydat$ss, mydat$id, FUN=f))
# id time ss ss_imp
# 11 1 0 2 2.0
# 12 1 1 2 2.0
# 13 1 2 4 4.0
# 14 1 3 3 3.0
# 15 1 4 NA 1.5
# 16 1 5 0 0.0
# 17 1 6 0 0.0
# 21 2 0 1 1.0
# 22 2 1 4 4.0
# 23 2 2 0 0.0
# 24 2 3 NA 0.0
# 25 2 4 0 0.0
# 26 2 5 0 0.0
# 27 2 6 0 0.0
# 31 3 0 4 4.0
# 32 3 1 2 2.0
# 33 3 2 1 1.0
# 34 3 3 3 3.0
# 35 3 4 3 3.0
# 36 3 5 2 2.0
# 37 3 6 NA NA
# 41 4 0 3 3.0
# 42 4 1 4 4.0
# 43 4 2 3 3.0
# 44 4 3 NA 3.0
# 45 4 4 NA 1.5
# 46 4 5 0 0.0
# 47 4 6 0 0.0