【问题标题】:How to interpolate missing values in a time series, limited by the number of sequential NAs (R)?如何在时间序列中插入缺失值,受连续 NA(R)数量的限制?
【发布时间】:2018-08-22 01:23:15
【问题描述】:

我在日期的时间序列中有缺失值。例如:

set.seed(101)

df <- data.frame(DATE = as.Date(c('2012-01-01', '2012-01-02', 
'2012-01-03', '2012-01-05', '2012-01-06', '2012-01-15', '2012-01-18', 
'2012-01-19', '2012-01-20', '2012-01-22')),
                 VALUE = rnorm(10, mean = 5, sd = 2))

如何编写一个函数来填充第一个日期和最后一个日期之间的所有缺失日期(即 2012-01-01 和 2012-01-22'),然后使用插值(线性和平滑样条)来填充缺失值,但不超过 3 个连续缺失值(即 2012-01-06 和 2012-01-15 之间没有插值)?

该函数将应用于一个非常大的数据框。我已经能够编写一个函数,该函数使用线性插值来填充两个日期之间的所有缺失值(见下文),但我无法弄清楚如何停止它对长时间的缺失值进行插值。

interpolate.V <- function(df){

  # sort data by time 
  df <- df[order(df$DATE),]

  # linnearly interpolate VALUE for all missing DATEs
  temp <- with(df, data.frame(approx(DATE, VALUE, xout = seq(DATE[1], 
               DATE[nrow(df)], "day"))))
  colnames(temp) <- c("DATE", "VALUE_INTERPOLATED")
  temp$ST_ID <- df$ST_ID[1]
  out <- merge(df, temp, all = T)
  rm(temp)

  return(out)
}

任何帮助将不胜感激!

谢谢

【问题讨论】:

  • 您的示例没有缺失值
  • 参见zoo::na.approx 及其maxgap 参数。

标签: r time-series interpolation missing-data


【解决方案1】:

为所有缺失日期添加行的函数:

date.range <- function(sub){

  sub$DATE <- as.Date(sub$DATE)
  DATE <- seq.Date(min(sub$DATE), max(sub$DATE), by="day")
  all.dates <- data.frame(DATE)
  out <- merge(all.dates, sub, all = T)

  return(out)
}

使用带有 maxgap 参数的 zoo 包中的 na.approx 或 na.spline:

interpolate.zoo <- function(df){
  df$VALUE_INT <- na.approx(df$VALUE, maxgap = 3, na.rm = F)
  return(df)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 2015-12-18
    • 2021-01-01
    • 1970-01-01
    • 2016-03-28
    • 2021-10-11
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多