Ric*_*ton 7 r time-series missing-data
我有一个数据框,其中包含每月数据的时间序列,其中包含一些缺失值.
dates <- seq(
as.Date("2010-01-01"), as.Date("2017-12-01"), "1 month"
)
n_dates <- length(dates)
dates <- dates[runif(n_dates) < 0.5]
time_data <- data.frame(
date = dates,
value = rnorm(length(dates))
)
## date value
## 1 2010-02-01 1.3625419
## 2 2010-06-01 0.1512481
## etc.
Run Code Online (Sandbox Code Playgroud)
为了能够利用时间序列预测功能,例如forecast,我想将其转换为ts对象.
这样做的愚蠢方法是在整个时间段内创建一组常规的月度日期,然后将联接返回到原始数据.
library(dplyr)
first_date <- min(time_data$date)
last_date <- max(time_data$date)
full_dates <- data.frame(
date = seq(first_date, last_date, "1 month")
)
extended_time_data <- left_join(full_dates, time_data, by = "date")
## date value
## 1 2010-02-01 1.3625419
## 2 2010-03-01 NA
## etc.
Run Code Online (Sandbox Code Playgroud)
现在我可以使用创建时间序列了ts().
library(lubridate)
time_series <- ts(
extended_time_data$value,
start = c(year(first_date), month(first_date)),
frequency = 12
)
Run Code Online (Sandbox Code Playgroud)
对于这么简单的任务,这是冗长且非常粗糙的.
我也研究了第一次转换xts,并使用timetk包中的转换器,但没有任何东西跳出来作为一种更简单的方式.
这个问题是如何创建缺少日期时间值的时间序列,但答案甚至更模糊.
如何ts从缺少值的时间序列中创建对象?
使用最后注释中定义的输入数据框,将其转换为索引为class的zoo对象yearmon.然后as.ts将其转换为ts.
library(zoo)
z <- read.zoo(DF, FUN = as.yearmon)
as.ts(z)
## Jan Feb Mar Apr May Jun Jul Aug
## 2000 1 NA NA 2 3 NA 4 5
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢用管道来表达它:
library(magrittr)
library(zoo)
DF %>% read.zoo(FUN = as.yearmon) %>% as.ts
Run Code Online (Sandbox Code Playgroud)
如果需要,使用na.locf(最后一次出现),na.approx(线性插值)na.spline,na.StructTS(季节性卡尔曼滤波器)或其他动物园NA填充函数来插值时间序列中的值.例如
library(forecast)
DF %>% read.zoo(FUN = as.yearmon) %>% as.ts %>% na.spline %>% forecast
Run Code Online (Sandbox Code Playgroud)
因为随机数,而不使用问题的数据是不可再生set.seed和n_dates不确定.下面我们DF为了举例的目的可再现地定义数据帧.
library(zoo)
dates <- as.Date(as.yearmon("2000-01") + c(0, 3, 4, 6, 7)/12)
DF <- data.frame(dates, values = seq_along(dates))
Run Code Online (Sandbox Code Playgroud)
赠送:
> DF
dates values
1 2000-01-01 1
2 2000-04-01 2
3 2000-05-01 3
4 2000-07-01 4
5 2000-08-01 5
Run Code Online (Sandbox Code Playgroud)
而不是使用left_join更简单的选项complete,将其转换tsibble为现在与forecast包函数兼容的对象
library(tidyverse)
library(tsibble)
time_data %>%
complete(date = seq(min(date), max(date), by = "1 month"),
fill = list(value = NA)) %>%
as_tsibble(index = date)
# A tsibble: 94 x 2 [1D]
# date value
# <date> <dbl>
# 1 2010-02-01 1.02
# 2 2010-03-01 NA
# 3 2010-04-01 NA
# 4 2010-05-01 1.75
# 5 2010-06-01 NA
# 6 2010-07-01 NA
# 7 2010-08-01 -0.233
# 8 2010-09-01 NA
# 9 2010-10-01 NA
#10 2010-11-01 -0.987
# ... with 84 more rows
Run Code Online (Sandbox Code Playgroud)
如上所述,它与forecast功能兼容
library(fable)
time_data %>%
complete(date = seq(min(date), max(date), by = "1 month"),
fill = list(value = 0)) %>%
as_tsibble(index = date) %>%
ETS(value) %>%
forecast %>%
autoplot
Run Code Online (Sandbox Code Playgroud)
注意:这里,缺失值被估算为0.
它可以与之前的非NA值一起估算 fill
time_data %>%
complete(date = seq(min(date), max(date), by = "1 month")) %>%
fill(value) %>%
as_tsibble(index = date) %>%
ETS(value) %>%
forecast %>%
autoplot
Run Code Online (Sandbox Code Playgroud)
n_dates <- 3
Run Code Online (Sandbox Code Playgroud)