Creare serie temporali regolari da un irregolare (as.Date) serie temporali con frequenza = 23
-
26-10-2019 - |
Domanda
Ho il seguente problema in R. vorrei creare un ts () dell'oggetto (vale a dire una serie di tempi regolamentari) da una serie di tempo irregolare (vale a dire un elenco di date e valori dei dati).
È possibile riprodurre il problema con il seguente set di dati e script in R:
# dput(dd) result
dd <- structure(list(NDVI = structure(c(14L, 4L, 11L, 12L, 20L, 17L,
5L, 7L, 21L, 23L, 25L, 19L, 15L, 9L, 3L, 24L, 2L, 6L, 22L, 16L,
13L, 18L, 10L, 8L, 1L), .Names = c("1", "2", "3", "4", "5", "6",
"7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17",
"18", "19", "20", "21", "22", "23", "24", "25"), .Label = c("0.4186",
"0.5452", "0.5915", "0.5956", "0.6010", "0.6860", "0.6966", "0.7159",
"0.7161", "0.7264", "0.7281", "0.7523", "0.7542", "0.7701", "0.7751",
"0.7810", "0.7933", "0.8075", "0.8113", "0.8148", "0.8207", "0.8302",
"0.8305", "0.8369", "0.9877"), class = "factor"), DATUM = structure(c(11005,
11021, 11037, 11085, 11101, 11117, 11133, 11149, 11165, 11181,
11197, 11213, 11229, 11245, 11261, 11277, 11293, 11309, 11323,
11339, 11355, 11371, 11387, 11403, 11419), class = "Date")), .Names = c("NDVI",
"DATUM"), row.names = c("1", "2", "3", "4", "5", "6", "7", "8",
"9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
"20", "21", "22", "23", "24", "25"), class = "data.frame")
require(zoo)
dd$DATUM <- as.Date(dd$DATUM,"A%Y%j") # Ayear,julianday
z <- zoo(dd$NDVI,dd$DATUM,frequency=23)
z # this is a regular time series with a frequency=23 and start=c(2000,1)
# there are 5 measurements in 2000 (2 jan, 1 feb, 2 apr) for which no data is available
# this should be marked as an NA is the final regular time series
ts.z <- as.ts(z,start=c(2000,1),frequency=23)
Ma questo non funziona, come ho ottenere una serie di tempo molto lungo regolari contenenti passi orarie giornaliere. Vorrei ottenere un ts oggetto con una frequenza = 23 indica correttamente la posizione per la quale i dati non è disponibile come NA.
Ho cercato tutto sull'esempio elencati qui per i dati annuali Convert una serie temporale irregolare ad una serie tempo normale
ma non funziona per i dati con una frequenza di 23 (cioè 23 valori all'anno). Credo di poter risolvere evitando di set dd$DATUM
as.Date()
ma come un oggetto zoo che può essere ordinato come una serie temporale con 23 valori all'anno.
Tutte le idee?
Grazie per il vostro aiuto
Soluzione
23 non in modo uniforme dividere nel numero di giorni in un anno in modo da avere a sintetizzare la propria scala di tempo in modo tale che ogni anno è diviso in 23 parti uguali. Convert dd
(la versione che ha tempi di classe "Data") per lo zoo e creare una nuova serie basata su una nuova scala formata da l'anno più una frazione. Infine la conversione che per una serie ts:
library(zoo)
z <- zoo(as.numeric(as.character(dd[[1]])), dd[[2]])
lt <- unclass(as.POSIXlt(time(z)))
yr <- lt$year + 1900
jul <- lt$yday
delta <- min(unlist(tapply(jul, yr, diff))) # 16
zz <- aggregate(z, yr + jul / delta / 23)
as.ts(zz)
dando:
Time Series:
Start = c(2000, 4)
End = c(2001, 7)
Frequency = 23
[1] 0.7701 0.5956 0.7281 NA NA 0.7523 0.8148 0.7933 0.6010 0.6966
[11] 0.8207 0.8305 0.9877 0.8113 0.7751 0.7161 0.5915 0.8369 0.5452 0.6860
[21] 0.8302 0.7810 0.7542 0.8075 0.7264 0.7159 0.4186