使用缺失数据前后的观察来估算纵向数据
Imputation for longitudinal data using observation before and after missing data
我正在清理一些纵向数据,我有几个遗漏的案例。我正在尝试使用包含缺失案例前后观察结果的估算。我想知道如何着手解决下面详述的问题。
我一直在尝试将问题分解为更小、更易于管理的操作和对象,但是,我不断提出的解决方案迫使我使用基于缺失值上方和下方的行的条件格式,并且,坦率地说,我对如何做到这一点有点不知所措。如果您认为您知道我可以使用、试验的好技术,或者如果您知道我在查找解决方案时可以使用的任何好的搜索词,我希望得到一些指导。
详情如下:
#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,3,2,3,NA,0,0,2,4,0,NA,0,0,0,4,1,2,4,2,3,NA,2,1,0,NA,NA,0,0)
mydat <- data.frame(id, time, ss)
*粗体字符代表上述数据集的变化
这里的目标是找到一种方法来获取 ID #1(变量 ss)的 NA 值之前 (3) 和之后 (0) 的平均值,以便数据如下所示:
1,3,2,3,1.5,0,0,
ID# 2(变量 ss)应如下所示:
2,4,0,0,0,0,0
ID #3(变量 ss)应该使用 上次观察结转 方法,因此它需要看起来像这样:
4,1,2 ,4,2,3,3
ID #4(变量 ss)有两个连续的 NA 值,不应更改。稍后将在我的项目中将其标记为进行不同的分析。因此,它应该如下所示:
2,1,0,NA,NA,0,0(无变化)。
我使用了一个包,smwrBase,下面是只填1个缺失值的语法,但没有解决id。
smwrBase::fillMissing(ss, max.fill=1)
zoo 包可能更标准,但同样的问题。
zoo::na.approx(ss, maxgap=1)
下面是一种考虑变量 id 的方法。当前的插值方法不喜欢填写最后一个值,因此我为此添加了一个 if stmt 手册。有点蛮力,因为那里可能有一种实用的方法。
> 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,3,2,3,NA,0,0,2,4,0,NA,0,0,0,4,1,2,4,2,3,NA,2,1,0,NA,NA,0,0)
> mydat <- data.frame(id, time, ss, ss2=NA_real_)
> for (i in unique(id)) {
+ # interpolate for gaps
+ mydat$ss2[mydat$id==i] <- zoo::na.approx(ss[mydat$id==i], maxgap=1, na.rm=FALSE)
+ # extension for gap as last value
+ if(is.na(mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])])) {
+ mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])] <-
+ mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])-1]
+ }
+ }
> mydat
id time ss ss2
1 1 0 1 1.0
2 1 1 3 3.0
3 1 2 2 2.0
4 1 3 3 3.0
5 1 4 NA 1.5
6 1 5 0 0.0
7 1 6 0 0.0
8 2 0 2 2.0
9 2 1 4 4.0
10 2 2 0 0.0
11 2 3 NA 0.0
12 2 4 0 0.0
13 2 5 0 0.0
14 2 6 0 0.0
15 3 0 4 4.0
16 3 1 1 1.0
17 3 2 2 2.0
18 3 3 4 4.0
19 3 4 2 2.0
20 3 5 3 3.0
21 3 6 NA 3.0
22 4 0 2 2.0
23 4 1 1 1.0
24 4 2 0 0.0
25 4 3 NA NA
26 4 4 NA NA
27 4 5 0 0.0
28 4 6 0 0.0
id=1的内插值是1.5(3和0的平均值),id=2是0(0和0的平均值,id=3是3(前面没有后面的值)值)。
我正在清理一些纵向数据,我有几个遗漏的案例。我正在尝试使用包含缺失案例前后观察结果的估算。我想知道如何着手解决下面详述的问题。
我一直在尝试将问题分解为更小、更易于管理的操作和对象,但是,我不断提出的解决方案迫使我使用基于缺失值上方和下方的行的条件格式,并且,坦率地说,我对如何做到这一点有点不知所措。如果您认为您知道我可以使用、试验的好技术,或者如果您知道我在查找解决方案时可以使用的任何好的搜索词,我希望得到一些指导。
详情如下:
#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,3,2,3,NA,0,0,2,4,0,NA,0,0,0,4,1,2,4,2,3,NA,2,1,0,NA,NA,0,0)
mydat <- data.frame(id, time, ss)
*粗体字符代表上述数据集的变化
这里的目标是找到一种方法来获取 ID #1(变量 ss)的 NA 值之前 (3) 和之后 (0) 的平均值,以便数据如下所示:
1,3,2,3,1.5,0,0,
ID# 2(变量 ss)应如下所示:
2,4,0,0,0,0,0
ID #3(变量 ss)应该使用 上次观察结转 方法,因此它需要看起来像这样:
4,1,2 ,4,2,3,3
ID #4(变量 ss)有两个连续的 NA 值,不应更改。稍后将在我的项目中将其标记为进行不同的分析。因此,它应该如下所示:
2,1,0,NA,NA,0,0(无变化)。
我使用了一个包,smwrBase,下面是只填1个缺失值的语法,但没有解决id。
smwrBase::fillMissing(ss, max.fill=1)
zoo 包可能更标准,但同样的问题。
zoo::na.approx(ss, maxgap=1)
下面是一种考虑变量 id 的方法。当前的插值方法不喜欢填写最后一个值,因此我为此添加了一个 if stmt 手册。有点蛮力,因为那里可能有一种实用的方法。
> 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,3,2,3,NA,0,0,2,4,0,NA,0,0,0,4,1,2,4,2,3,NA,2,1,0,NA,NA,0,0)
> mydat <- data.frame(id, time, ss, ss2=NA_real_)
> for (i in unique(id)) {
+ # interpolate for gaps
+ mydat$ss2[mydat$id==i] <- zoo::na.approx(ss[mydat$id==i], maxgap=1, na.rm=FALSE)
+ # extension for gap as last value
+ if(is.na(mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])])) {
+ mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])] <-
+ mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])-1]
+ }
+ }
> mydat
id time ss ss2
1 1 0 1 1.0
2 1 1 3 3.0
3 1 2 2 2.0
4 1 3 3 3.0
5 1 4 NA 1.5
6 1 5 0 0.0
7 1 6 0 0.0
8 2 0 2 2.0
9 2 1 4 4.0
10 2 2 0 0.0
11 2 3 NA 0.0
12 2 4 0 0.0
13 2 5 0 0.0
14 2 6 0 0.0
15 3 0 4 4.0
16 3 1 1 1.0
17 3 2 2 2.0
18 3 3 4 4.0
19 3 4 2 2.0
20 3 5 3 3.0
21 3 6 NA 3.0
22 4 0 2 2.0
23 4 1 1 1.0
24 4 2 0 0.0
25 4 3 NA NA
26 4 4 NA NA
27 4 5 0 0.0
28 4 6 0 0.0
id=1的内插值是1.5(3和0的平均值),id=2是0(0和0的平均值,id=3是3(前面没有后面的值)值)。