生存分析的数据清理
Data Cleaning for Survival Analysis
我正在为生存分析清理一些数据,我正在努力做到这一点,以便一个人只有一个单一的、持续的、从症状出现 (ss=1) 到症状缓解 ( SS = 0)。一个人必须有一个完整的 持续 缓解才能算作缓解。除了统计 problems/issues,我想知道如何着手解决下面详述的问题。
我一直在尝试将问题分解为更小、更易于管理的操作和对象,但是,我不断提出的解决方案迫使我使用基于缺失值上方和下方的行的条件格式,并且,坦率地说,我对如何做到这一点有点不知所措。如果您认为您知道我可以使用、试验的好技术,或者如果您知道我在查找解决方案时可以使用的任何好的搜索词,我希望得到一些指导。
详情如下:
#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(1,1,1,1,NA,0,0,1,1,0,NA,0,0,0,1,1,1,1,1,1,NA,1,1,0,NA,NA,0,0)
mydat <- data.frame(id, time, ss)
*粗体和下划线字符代表上述数据集的变化
这里的目标是找到一种方法让 ID #1(变量 ss)的 NA 值看起来像这样:1,1,1,1,1 ,0,0
ID# 2(变量 ss)看起来像这样:1,1,0,0,0,0,0
ID #3(变量 ss)看起来像这样:1,1,1,1,1,1,NA(没有变化,因为带有 NA 的行最终会被删除)
ID #4(变量 ss)看起来像这样:1,1,1,1,1,0,0(这个需要多次修改,我期待它是最具挑战性的)。
我真的认为您没有考虑所有 "edge case"。在一个周期结束时连续出现两个 NA 或连续出现 4 或 5 个 NA 怎么办。这将在您的小测试用例中为您提供所需的解决方案,但是,使用 na.locf
-function:
require(zoo)
fillNA <- function(vec) { if ( is.na(tail(vec, 1)) ){ vec } else { vec <- na.locf(vec) }
}
> mydat$locf <- with(mydat, ave(ss, id, FUN=fillNA))
> mydat
id time ss locf
1 1 0 1 1
2 1 1 1 1
3 1 2 1 1
4 1 3 1 1
5 1 4 NA 1
6 1 5 0 0
7 1 6 0 0
8 2 0 1 1
9 2 1 1 1
10 2 2 0 0
11 2 3 NA 0
12 2 4 0 0
13 2 5 0 0
14 2 6 0 0
15 3 0 1 1
16 3 1 1 1
17 3 2 1 1
18 3 3 1 1
19 3 4 1 1
20 3 5 1 1
21 3 6 NA NA
22 4 0 1 1
23 4 1 1 1
24 4 2 0 0
25 4 3 NA 0
26 4 4 NA 0
27 4 5 0 0
28 4 6 0 0
我正在为生存分析清理一些数据,我正在努力做到这一点,以便一个人只有一个单一的、持续的、从症状出现 (ss=1) 到症状缓解 ( SS = 0)。一个人必须有一个完整的 持续 缓解才能算作缓解。除了统计 problems/issues,我想知道如何着手解决下面详述的问题。
我一直在尝试将问题分解为更小、更易于管理的操作和对象,但是,我不断提出的解决方案迫使我使用基于缺失值上方和下方的行的条件格式,并且,坦率地说,我对如何做到这一点有点不知所措。如果您认为您知道我可以使用、试验的好技术,或者如果您知道我在查找解决方案时可以使用的任何好的搜索词,我希望得到一些指导。
详情如下:
#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(1,1,1,1,NA,0,0,1,1,0,NA,0,0,0,1,1,1,1,1,1,NA,1,1,0,NA,NA,0,0)
mydat <- data.frame(id, time, ss)
*粗体和下划线字符代表上述数据集的变化
这里的目标是找到一种方法让 ID #1(变量 ss)的 NA 值看起来像这样:1,1,1,1,1 ,0,0
ID# 2(变量 ss)看起来像这样:1,1,0,0,0,0,0
ID #3(变量 ss)看起来像这样:1,1,1,1,1,1,NA(没有变化,因为带有 NA 的行最终会被删除)
ID #4(变量 ss)看起来像这样:1,1,1,1,1,0,0(这个需要多次修改,我期待它是最具挑战性的)。
我真的认为您没有考虑所有 "edge case"。在一个周期结束时连续出现两个 NA 或连续出现 4 或 5 个 NA 怎么办。这将在您的小测试用例中为您提供所需的解决方案,但是,使用 na.locf
-function:
require(zoo)
fillNA <- function(vec) { if ( is.na(tail(vec, 1)) ){ vec } else { vec <- na.locf(vec) }
}
> mydat$locf <- with(mydat, ave(ss, id, FUN=fillNA))
> mydat
id time ss locf
1 1 0 1 1
2 1 1 1 1
3 1 2 1 1
4 1 3 1 1
5 1 4 NA 1
6 1 5 0 0
7 1 6 0 0
8 2 0 1 1
9 2 1 1 1
10 2 2 0 0
11 2 3 NA 0
12 2 4 0 0
13 2 5 0 0
14 2 6 0 0
15 3 0 1 1
16 3 1 1 1
17 3 2 1 1
18 3 3 1 1
19 3 4 1 1
20 3 5 1 1
21 3 6 NA NA
22 4 0 1 1
23 4 1 1 1
24 4 2 0 0
25 4 3 NA 0
26 4 4 NA 0
27 4 5 0 0
28 4 6 0 0