缺失值 - Arima 模型
Missing values - Arima model
我有一个关于产品销售的每日时间序列,我的序列从 01/01/2016 开始到 31/08/2017。
考虑到这是一个为期六天的一周(我的一周从星期一开始到星期六结束)没有星期日的数据,我明白在 运行创建 Arima 模型之前我需要先填充缺失值。这是我需要帮助的地方:我读到我可以用 na.approx
或 NA
填充缺失值,但我不知道该怎么做。
你可以在这里看到我的系列:
https://drive.google.com/file/d/0BzIf8XvzKOGWSm1ucUdYUVhfVGs/view?usp=sharing
如您所见,周日没有数据。我需要知道如何将缺失值填充到 运行 Arima 模型并能够预测 2017 年的剩余时间。
这里有三种方法:
library(lubridate)
library(xts)
library(dplyr)
library(forecast)
df$Date = mdy(df$Date)
删除星期日:
ts_no_sunday = df %>%
filter(wday(df$Date) != 1) %>%
{xts(.$Units, .$Date)}
plot(ts_no_sunday)
no_sunday_arima = auto.arima(ts_no_sunday)
plot(forecast(no_sunday_arima, h = 10))
用 NA 替换星期日:
ts_sunday = df %>%
mutate(Units = replace(Units, which(wday(df$Date) == 1), NA)) %>%
{xts(.$Units, .$Date)}
plot(ts_sunday)
sunday_arima = auto.arima(ts_sunday)
plot(forecast(sunday_arima, h = 10))
内插星期日:
ts_interp = df %>%
mutate(Units = replace(Units, which(wday(df$Date) == 1), NA),
Units = na.approx(Units)) %>%
{xts(.$Units, .$Date)}
plot(ts_interp)
interp_arima = auto.arima(ts_interp)
plot(forecast(interp_arima, h = 10))
备注:
正如你所看到的,它们产生了不同的预测。这是因为第一个时间序列是不规则的,第二个是具有缺失值的规则时间序列,第三个是具有插值数据的规则时间序列。在我看来,处理缺失值的更好方法是在拟合 ARIMA 之前进行插值,因为 ARIMA 假设时间序列是规则间隔的。然而,这也取决于您的 "missing" 数据点是否确实缺失,而不是 activity 中的停止点。前者应该用插值来处理,而对于后者,您最好删除星期日并将时间序列视为星期日不存在。
在 How to handle nonexistent or missing data? 上查看此讨论
这是 Using the R forecast package with missing values and/or irregular time series
原则上您可以使用 imputeTS(用于填充 NA)- forecast(用于进行预测)组合。
这很容易做到:
library("imputeTS")
library("forecast")
ts_sunday %>% na_kalman() %>% auto.arima() %>% forecast(h=10)
会做这份工作。 但是在这种特定情况下,这将是一个坏主意。如果数据随机丢失,您可以考虑使用此解决方案。但事实并非如此——缺席的总是星期天。一些时间序列模型也可以处理 NA 并仍然构建模型。(但缺点与以前的解决方案几乎相同)。模型应该如何对待星期日,因为它从未被观察到...可能最好的解决方案(从统计角度来看)是 avid_useR
在另一个答案中描述的完全删除星期日。如果您不需要星期日 - 并且无论如何都没有星期日的值,那么只需删除它们。但通常这迟早会导致下一个问题 ..'how to treat public holidays' - 通常也是 NA。还要始终牢记您的问题 - 一种解决方案可能适合一种设置 - 对于另一种设置可能没有意义。
我有一个关于产品销售的每日时间序列,我的序列从 01/01/2016 开始到 31/08/2017。
考虑到这是一个为期六天的一周(我的一周从星期一开始到星期六结束)没有星期日的数据,我明白在 运行创建 Arima 模型之前我需要先填充缺失值。这是我需要帮助的地方:我读到我可以用 na.approx
或 NA
填充缺失值,但我不知道该怎么做。
你可以在这里看到我的系列:
https://drive.google.com/file/d/0BzIf8XvzKOGWSm1ucUdYUVhfVGs/view?usp=sharing
如您所见,周日没有数据。我需要知道如何将缺失值填充到 运行 Arima 模型并能够预测 2017 年的剩余时间。
这里有三种方法:
library(lubridate)
library(xts)
library(dplyr)
library(forecast)
df$Date = mdy(df$Date)
删除星期日:
ts_no_sunday = df %>%
filter(wday(df$Date) != 1) %>%
{xts(.$Units, .$Date)}
plot(ts_no_sunday)
no_sunday_arima = auto.arima(ts_no_sunday)
plot(forecast(no_sunday_arima, h = 10))
用 NA 替换星期日:
ts_sunday = df %>%
mutate(Units = replace(Units, which(wday(df$Date) == 1), NA)) %>%
{xts(.$Units, .$Date)}
plot(ts_sunday)
sunday_arima = auto.arima(ts_sunday)
plot(forecast(sunday_arima, h = 10))
内插星期日:
ts_interp = df %>%
mutate(Units = replace(Units, which(wday(df$Date) == 1), NA),
Units = na.approx(Units)) %>%
{xts(.$Units, .$Date)}
plot(ts_interp)
interp_arima = auto.arima(ts_interp)
plot(forecast(interp_arima, h = 10))
备注:
正如你所看到的,它们产生了不同的预测。这是因为第一个时间序列是不规则的,第二个是具有缺失值的规则时间序列,第三个是具有插值数据的规则时间序列。在我看来,处理缺失值的更好方法是在拟合 ARIMA 之前进行插值,因为 ARIMA 假设时间序列是规则间隔的。然而,这也取决于您的 "missing" 数据点是否确实缺失,而不是 activity 中的停止点。前者应该用插值来处理,而对于后者,您最好删除星期日并将时间序列视为星期日不存在。
在 How to handle nonexistent or missing data? 上查看此讨论 这是 Using the R forecast package with missing values and/or irregular time series
原则上您可以使用 imputeTS(用于填充 NA)- forecast(用于进行预测)组合。
这很容易做到:
library("imputeTS")
library("forecast")
ts_sunday %>% na_kalman() %>% auto.arima() %>% forecast(h=10)
会做这份工作。 但是在这种特定情况下,这将是一个坏主意。如果数据随机丢失,您可以考虑使用此解决方案。但事实并非如此——缺席的总是星期天。一些时间序列模型也可以处理 NA 并仍然构建模型。(但缺点与以前的解决方案几乎相同)。模型应该如何对待星期日,因为它从未被观察到...可能最好的解决方案(从统计角度来看)是 avid_useR
在另一个答案中描述的完全删除星期日。如果您不需要星期日 - 并且无论如何都没有星期日的值,那么只需删除它们。但通常这迟早会导致下一个问题 ..'how to treat public holidays' - 通常也是 NA。还要始终牢记您的问题 - 一种解决方案可能适合一种设置 - 对于另一种设置可能没有意义。