首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非规则时间序列的R插值

非规则时间序列的R插值
EN

Stack Overflow用户
提问于 2020-04-07 18:58:39
回答 1查看 836关注 0票数 4

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

然而,对于不规则的时间序列,我遇到了问题,因为插值的值均匀分布在间隔的数量上,而没有考虑到值的相关时间戳。

我找到了一种使用approxfun()的替代方法,但我想知道是否有更干净的解决方案,理想情况下是基于带有tidyverts包家族函数的tsibble对象?

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

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

代码语言:javascript
复制
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   

有什么办法(有效地)处理这个问题吗?多谢你们的支持!

EN

回答 1

Stack Overflow用户

发布于 2020-04-07 19:05:27

就我个人而言,我会使用您正在使用的解决方案,但为了展示如何使用na.approx,在这种情况下,我们可以在使用na.approx之前对日期序列进行complete,并将其与原始df连接以保留原始行。

代码语言:javascript
复制
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   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61078446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档