【问题标题】:Interpolation of irregular time series with R用 R 插值不规则时间序列
【发布时间】:2020-07-19 13:14:42
【问题描述】:

在 R 中搜索时间序列数据的线性插值时,我经常从 zoo 包中找到使用 na.approx() 的建议。

但是,对于不规则的时间序列,我遇到了问题,因为插值均匀分布在间隙数中,没有考虑值的关联时间戳。

我找到了使用approxfun() 的解决方法,但我想知道是否有更简洁的解决方案,最好基于tsibble 对象以及tidyverts 包系列中的函数?

以前的答案依赖于通过填补空白将不规则日期网格扩展到规则网格。但是,当插值过程中应考虑白天时,这会导致问题。

这里有一个(修改后的)最小示例,带有 POSIXct 时间戳,而不是仅日期:

library(tidyverse)
library(zoo)

df <- tibble(date = as.POSIXct(c("2000-01-01 00:00", "2000-01-02 02:00", "2000-01-05 00:00")),
             value = c(1,NA,2))

df %>% 
  mutate(value_int_wrong = na.approx(value),
         value_int_correct = approxfun(date, value)(date))

# A tibble: 3 x 4
  date                value value_int_wrong value_int_correct
  <dttm>              <dbl>           <dbl>             <dbl>
1 2000-01-01 00:00:00     1             1                1   
2 2000-01-02 02:00:00    NA             1.5              1.27
3 2000-01-05 00:00:00     2             2                2   

任何想法如何(有效地)处理这个?感谢您的支持!

【问题讨论】:

  • 您好 Jens,您找到满意的解决方案了吗?我会感兴趣的。

标签: r time-series tidyverse linear-interpolation tidyverts


【解决方案1】:

这是一个等效的基于 tsibble 的解决方案。 interpolate() 函数需要一个模型,但您可以使用随机游走在点之间进行线性插值。

library(tidyverse)
library(tsibble)
library(fable)
#> Loading required package: fabletools

df <- tibble(
  date = as.Date(c("2000-01-01", "2000-01-02", "2000-01-05", "2000-01-06")),
  value = c(1, NA, 2, 1.5)
) %>%
  as_tsibble(index = date) %>%
  fill_gaps()

df %>%
  model(naive = ARIMA(value ~ -1 + pdq(0,1,0) + PDQ(0,0,0))) %>%
  interpolate(df)
#> # A tsibble: 6 x 2 [1D]
#>   date       value
#>   <date>     <dbl>
#> 1 2000-01-01  1   
#> 2 2000-01-02  1.25
#> 3 2000-01-03  1.5 
#> 4 2000-01-04  1.75
#> 5 2000-01-05  2   
#> 6 2000-01-06  1.5

reprex package (v0.3.0) 于 2020 年 4 月 8 日创建

【讨论】:

  • 您好 Rob,非常感谢您的回答。我希望你能看看!我不得不修改我的最小示例,因为实际上我处理的时间序列也解决了一天中的时间。我试图在我修改后的示例数据集上运行您的代码,但这导致了一条错误消息(“找不到合适的 ARIMA 模型。这可能是因为自动选择不会选择具有可能在数值上不稳定的特征根的模型。”) .您的解决方案可以被 POSIXct 采用吗?感谢您分享您的专业知识!
  • 我更新了我的答案以更具体,以防 POSIXct 将其混淆为选择季节性模型。如果它仍然导致错误,请您在github.com/tidyverts/fable/issues 发布带有可重现示例的错误报告
  • 嗨 Rob,再次感谢,但它似乎不适用于我的最小示例。我在github.com/tidyverts/fable/issues/256 开了一个问题
【解决方案2】:

就个人而言,我会选择您正在使用的解决方案,但要展示如何使用na.approx,在这种情况下,我们可以在使用na.approx 之前将日期序列complete 与原始df 加入到保留原始行。

library(dplyr)

df %>% 
  tidyr::complete(date = seq(min(date), max(date), by = "day")) %>%
  mutate(value_int = zoo::na.approx(value)) %>%
  right_join(df, by = "date") %>%
  select(date, value_int)


#  date       value_int
#  <date>         <dbl>
#1 2000-01-01      1   
#2 2000-01-02      1.25
#3 2000-01-05      2   

【讨论】:

  • 您好 Ronak,感谢您的即时答复。恐怕当日期向量具有高时间分辨率时,您提出的解决方案会起作用?我没有在我的最小示例中介绍这一点,但通常我正在使用的环境时间序列的分辨率为秒,但仍然每隔几天才测量一次。
  • 嗯,它可能效率低下,但我认为它仍然可以工作。
猜你喜欢
  • 1970-01-01
  • 2014-10-03
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2011-10-28
  • 2011-04-23
相关资源
最近更新 更多