使用R中的ROLLING平均值来估算缺失值

时间:2017-02-06 16:30:34

标签: r missing-data imputation imputets

我是R的新手,正在努力解决问题。

我需要一个函数来根据给定大小的窗口中元素的平均值来估算向量中的缺失值。

但是,此窗口会移动,因为我的NA位于第30位,我的窗口大小为10,应为x[20:40]计算平均值。因此,对于每个找到的NA,窗口均值将是不同的。

我一直在尝试这个:

impute.to.window.mean <- function(x, window) {

  na.idx <- is.na(x)  #find missing values in x

  for (na in na.idx) {

    y <- (x[na]-window):(x[na]+window)
    na.idx[na] <- mean(y, na.rm = TRUE)
  }

  return(x)
}

但它不正确,我不知道如何继续。

5 个答案:

答案 0 :(得分:1)

您可能需要考虑使用imputeTS包。以下是使用简单移动平均值和窗口4填充值的示例:

x <- rnorm(100)
x[c(7, 21, 33)] <- NA

imputeTS::na.ma(x, k = 4, weighting = "simple")

答案 1 :(得分:1)

使用zoo :: rollapply可以在一个语句中完成。我们在这个例子中使用了一个长度为5的窗口(当前点两侧各2个):

library(zoo)

x <- replace(1:20, c(4, 6, 10, 15), NA) # test data


rollapply(c(NA, NA, x, NA, NA), 5, 
    function(x) if (is.na(x[3])) mean(x, na.rm = TRUE) else x[3])

,并提供:

 [1]  1.000000  2.000000  3.000000  3.333333  5.000000  6.666667  7.000000
 [8]  8.000000  9.000000 10.000000 11.000000 12.000000 13.000000 14.000000
[15] 15.000000 16.000000 17.000000 18.000000 19.000000 20.000000

答案 2 :(得分:0)

与R base:

worker_threads

我唯一不同的是,我现在期待价值观。但是你可以根据你的要求改变它。

答案 3 :(得分:0)

您的索引有点偏离

impute.to.window.mean <- function(x, window) {
  na.idx <- which(is.na(x))  #find missing values in x

  for (na in na.idx) {
    y <- sort(x[(na - window):(na + window)])
    x[na] <- mean(y)
  }

  return(x)
}

浏览一个例子

set.seed(1)
x <- sample(10)
na <- 6
x[na] <- NA
# [1]  3  4  5  7  2 NA  9  6 10  1

window <- 3L

我使用了sort因为它一步就丢弃了NA;你想要这个向量的均值,它是window

中的所有值
sort(x[(na - window):(na + window)])
# [1]  2  5  6  7  9 10

mean(sort(x[(na - window):(na + window)]))
# [1] 6.5

立即测试您的功能

impute.to.window.mean(x, window)
# [1]  3.0  4.0  5.0  7.0  2.0  6.5  9.0  6.0 10.0  1.0

修改

实际上,您应该使用

y <- sort(x[pmax(1L, (na - window)):pmin(length(x), (na + window))])

而不是NA发生在2,而你的窗口是&gt; 1

## current version
impute.to.window.mean(x, 10)
# Error in x[(na - window):(na + window)] : 
#   only 0's may be mixed with negative subscripts

## version with pmax/pmin
impute.to.window.mean(x, 10)
# [1]  3.000000  4.000000  5.000000  7.000000  2.000000  5.222222  9.000000  6.000000 10.00000 1.000000

mean(sort(x))
# [1] 5.222222

impute.to.window.mean <- function(x, window) {
  na.idx <- which(is.na(x))  #find missing values in x

  for (na in na.idx) {
    # y <- sort(x[(na - window):(na + window)])
    y <- sort(x[pmax(1L, (na - window)):pmin(length(x), (na + window))])
    x[na] <- mean(y)
  }

  return(x)
}

答案 4 :(得分:0)

“Caret”包的 preProcess 函数有一个名为“knnImpute”的方法,它正是这样做的。试一试。