[英]Interpolation of irregular time series with R
在 R 中搜索時間序列數據的線性插值時,我經常從zoo
package 中找到使用na.approx()
的建議。
但是,對於不規則的時間序列,我遇到了問題,因為插值均勻分布在間隙的數量上,而不考慮值的關聯時間戳。
我找到了使用approxfun()
的工作,但我想知道是否有更清潔的解決方案,理想情況下基於tsibble
對象,並具有來自tidyverts
package 系列的功能?
以前的答案依賴於通過填補空白將不規則日期網格擴展到規則網格。 但是,當在插值期間應考慮白天時,這會導致問題。
這是一個(修訂后的)最小示例,帶有 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
任何想法如何(有效地)處理這個? 謝謝你的支持!
這是一個等效的基於 tsibble 的解決方案。 interpolate()
function 需要 model,但您可以使用隨機游走在點之間進行線性插值。
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 日創建
就個人而言,我將 go 與您正在使用的解決方案一起使用,但為了展示如何使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.