簡體   English   中英

在時間序列中插入缺失值並使用 R 創建一個時間序列 model,如協整、ARIMA(X) 和 SARIMA(X)

[英]Interpolate missing values in a time-series and create a time-series model like Cointegration, ARIMA(X) and SARIMA(X) using R

我有一個包含 18 個變量和 30k+ 觀察值的數據集,每 15 分鍾從傳感器收集一次數據。 一些變量收集溫度,這些變量將用作自變量來預測結構的 state。 在此期間,由於傳感器離線而丟失了一些數據,並且由於它們是異常值而刪除了其他一些觀測值。

有沒有辦法以相當准確的方式插入缺失值? 我一直在嘗試每 15 分鍾創建一個具有所有時間值的數據集,然后與具有所有值的數據集匹配

df$Hour <- substr(df$Time,15,16)
df$Hour <- replace(df$Hour, df$Hour > 0 & df$Hour < 15, "00")
df$Hour <- replace(df$Hour, df$Hour > 15 & df$Hour < 30, 15)
df$Hour <- replace(df$Hour, df$Hour > 30 & df$Hour < 45, 30)
df$Hour <- replace(df$Hour, df$Hour > 45 & df$Hour < 60, 45)
library(lubridate)
df$Time <- ymd_hm(paste(substr(df$Time,1,14),df$Hour,sep=""))
allDates <- seq(ISOdate(2018,4,27,14,15), ISOdate(2018,9,10,19,45), by = "15 min")
allValues <- merge(data.frame(Time=allDates),df,all.x=TRUE)

在此之后,我嘗試使用 Amelia package 但它返回錯誤:“數據中存在完全缺失的觀察結果” amelia(df, m = 5, p2s = 1, frontend = FALSE, idvars = "id", ts = "Time", cs = NULL, polytime = NULL, splinetime = NULL, intercs = FALSE, lags = 2:17, leads = 2:17, startvals = 0, tolerance = 0.0001, logs = NULL, sqrts = NULL, lgstc = NULL, noms = NULL, ords = NULL, incheck = TRUE, collect = FALSE, arglist = NULL, empri = 0.1*nrow(DadosTS), priors = NULL, autopri = 0.05, emburn = c(0,0), bounds = NULL, max.resample = 100, overimp = NULL, boot.type = "ordinary", ncpus = getOption("amelia.ncpus", 1L), cl = NULL) amelia(df, m = 5, p2s = 1, frontend = FALSE, idvars = "id", ts = "Time", cs = NULL, polytime = NULL, splinetime = NULL, intercs = FALSE, lags = 2:17, leads = 2:17, startvals = 0, tolerance = 0.0001, logs = NULL, sqrts = NULL, lgstc = NULL, noms = NULL, ords = NULL, incheck = TRUE, collect = FALSE, arglist = NULL, empri = 0.1*nrow(DadosTS), priors = NULL, autopri = 0.05, emburn = c(0,0), bounds = NULL, max.resample = 100, overimp = NULL, boot.type = "ordinary", ncpus = getOption("amelia.ncpus", 1L), cl = NULL)

任何處理此問題的方法/使用可用數據創建時間序列 model 將不勝感激

如果您想要時間序列插值/插補,您可以使用imputeTS package。

library(imputeTS)
x <- na_interpolation(df)

就是這樣。

但還有一些額外的提示:package 正在根據每個變量的時間間相關性進行插補(缺失數據替換)。 所以這不會考慮變量間的相關性(取決於數據,這可能會改善插補)。 另一方面,像您使用的 Amelia 只尋找變量間的相關性。 如果一行完全不適用,就像你的情況(NA,NA,NA,NA)一樣,它會失敗,因為那時沒有變量間相關性來估計缺失值。

在 imputeTS 中,您還可以選擇不同的時間序列插補算法。 上面的代碼用於通過線性插值進行插補。 你也可以做樣條插值:

library(imputeTS)
x <- na_interpolation(df, option = "spine)

另一個更高級的選項,如果您知道您的時間序列具有季節性,則特別有用的是通過卡爾曼平滑對 ARIMA model 的狀態空間模型/state 空間表示進行插補。

library(imputeTS)
x <- na_kalman(df)

package 中還有其他可用的插補/插值函數(請參閱本文

一般來說,如果您不希望有太多的變量間相關性,那么這些來自 imputeTS 列出的方法很可能是一個不錯的選擇。 如果您確實期望有很強的變量間相關性,那么還要看看其他方法。 例如,還可以使用 imputeTS 僅估算數據集的一列,然后再次使用 AMELIA(然后錯誤應該消失,因為您不再有完全 NA 的行)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM