Cree series de tiempo regulares a partir de una serie de tiempo irregular (AS. Date) con frecuencia = 23

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

  •  26-10-2019
  •  | 
  •  

Pregunta

Tengo el siguiente problema en R. Me gustaría crear un objeto TS () (es decir, una serie de tiempo regular) a partir de una serie de tiempo irregular (es decir, una lista de fechas y valores de datos).

Puede reproducir el problema con el siguiente conjunto de datos y R Script:

# 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)

Pero esto no funciona, ya que obtengo una serie de tiempo regular muy larga que contiene pasos de tiempo diarios. Me gustaría obtener un objeto TS con una frecuencia = 23 indicando correctamente la posición para la cual los datos no están disponibles como NA.

He estado intentando todo basado en el ejemplo que se enumera aquí para datos anuales.Convertir una serie de tiempo irregular a una serie de tiempo regular

Pero no funciona para datos con una frecuencia de 23 (es decir, 23 valores al año). Creo que podría resolverlo evitando establecer dd$DATUM as.Date() pero como un objeto zoológico que se puede ordenar como una serie temporal con 23 valores al año.

¿Algunas ideas?

Gracias por tu ayuda

¿Fue útil?

Solución

23 no se divide de manera uniforme en el número de días en un año, por lo que tendrá que sintetizar su propia escala de tiempo de modo que cada año se divida en 23 piezas iguales. Convertir dd (La versión que tiene tiempos de clase "datan") para zoológico y crea una nueva serie basada en una nueva escala compuesta por el año más una fracción. Finalmente, convierta eso en 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)

donación:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top