4

R で時系列データの線形補間を検索するとna.approx()zooパッケージから使用する推奨事項がよく見つかりました。

ただし、不規則な時系列では問題が発生しました。これは、値に関連付けられているタイムスタンプを考慮せずに、補間された値がギャップの数に均等に分散されるためです。

を使用して回避策を見つけましたが、理想的にはパッケージファミリーの機能を持つオブジェクトにapproxfun()基づいた、よりクリーンなソリューションがあるかどうか疑問に思いますか?tsibbletidyverts

以前の回答は、ギャップを埋めることによって不規則な日付グリッドを通常のグリッドに拡張することに依存していました。ただし、これは、補間時に日中を考慮に入れる必要がある場合に問題を引き起こします。

以下は、日付のみではなく 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   

これに(効率的に)対処する方法はありますか?ご協力ありがとうございました!

4

2 に答える 2

4

これは、同等の 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 パッケージ(v0.3.0)により 2020-04-08 に作成

于 2020-04-07T23:28:59.910 に答える
0

個人的には、あなたが使用しているソリューションを使用しますがna.approx、この場合の使用方法を示すために、使用するcomplete前に日付のシーケンスを使用し、元の行na.approxと結合して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   
于 2020-04-07T11:05:26.647 に答える