Creare serie temporali regolari da un irregolare (as.Date) serie temporali con frequenza = 23

StackOverflow https://stackoverflow.com/questions/4817779

  •  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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top