如何基于前一个和下一个观察值编写一个循环来自动估算纵向数据中的缺失值?

时间:2017-03-23 16:38:44

标签: r

我有一个包含许多缺失值的纵向数据集,我希望根据最后观察到的值'自动将其归入R中。继续前进,以及下一个观察到的价值'向后推。之前已经提出了类似的问题,但我想根据差距的长度添加特定的估算条件。

以下数据框(宽格式)演示了此问题:

miss.df <- data.frame(id = c('A','B','C','D','E'),
                      w1 = c(1,1,2,2,1),
                      w2 = c(1,NA,NA,2,NA),
                      w3 = c(NA,NA,NA,NA,2),
                      w4 = c(1,NA,NA,NA,NA),
                      w5 = c(1,2,NA,1,3),
                      w6 = c(1,2,1,NA,NA))

如此:

  id w1 w2 w3 w4 w5 w6
1  A  1  1 NA  1  1  1
2  B  1 NA NA NA  2  2
3  C  2 NA NA NA NA  1
4  D  2  2 NA NA  1 NA
5  E  1 NA  2 NA  3 NA

请注意,数据是宽格式的,因此w1是第一波,等等。第一波完成没有丢失。值是分类变量(政党偏好)的数值。这些类别没有订单。因此,该数据框由仅有六个波的五个人的一个变量的信息组成。

我想要的条件如下:

  1. 如果间隙只包含一个缺失,则向前移动最后观察值,包括间隙在最后一波中的情况。
  2. 如果差距为偶数次数的缺失(例如,id = C),则继续前进并后退,以使值“在中间”相遇。因此,假设个人在中途过渡(即改变类别)。
  3. 如果差距为奇数缺失次数(例如,id = B),则继续前进并返回到中间相遇,如第2点,但确切的中间值是推算为结转价值。
  4. 如果要运行具有上述条件的循环,数据框将如下所示:

      id w1 w2 w3 w4 w5 w6
    1  A  1  1  1  1  1  1
    2  B  1  1  1  2  2  2
    3  C  2  2  2  1  1  1
    4  D  2  2  2  1  1  1
    5  E  1  1  2  2  3  3
    

    提前致谢。

2 个答案:

答案 0 :(得分:0)

嗯。棘手。而且我不知道任何有用的R泛型用于填写NA。最后,我认为最简单的方法是一个好的旧for循环。逻辑是从左边填充一个,然后从右边填充一个,并重复此操作直到所有内容都填满。根本不是R - 它实际上可能是C代码 - 但除非你有多个行,否则应该没问题

fill_in_old_skool <- function (r) {  
  while (anyNA(r)) {
    for (idx in seq_along(r)) {
      val <- r[idx] 
      if (is.na(r[idx]) && idx > 1) r[idx] <- lastval
      lastval <- val
    }
    for (idx in rev(seq_along(r))) {
      val <- r[idx]
      if (is.na(r[idx]) && idx < length(r)) r[idx] <- lastval
      lastval <- val
    }
  }
  r
}

miss.df[,-1] <- t(apply(miss.df[,-1], 1, fill_in_old_skool))

答案 1 :(得分:0)

imputeTS 包的功能与您想要的功能非常相似。

该函数名为 na.ma(x,k = 2,加权=“简单”)

  

加权移动平均值缺失价值估算

基本上它对你的作用是: 如果您输入时间系列 x ,它会查找 k 下一个值,并将其平均值作为插补值。

不完全是您描述的内容,但我认为它可能类似于您提议的程序背后的想法。