Créer des séries chronologiques régulières d'une irrégularité (as.Date) série temporelle avec une fréquence = 23

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

  •  26-10-2019
  •  | 
  •  

Question

J'ai le problème suivant dans R. Je voudrais créer un objet ts () (par exemple une série de temps réglementaire) à partir d'une série temporelle irrégulière (à savoir une liste des dates et des valeurs de données).

Vous pouvez reproduire le problème avec le script ensemble et R données suivantes:

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

Mais cela ne fonctionne pas, comme j'obtenir une série de très longues périodes régulières contenant pas de temps journalier. Je souhaite obtenir un ts objet avec une fréquence = 23 indiquant correctement la position pour laquelle des données ne sont pas disponibles sous forme de Na.

J'ai essayé tout basé sur l'exemple ci-ici pour les données annuelles Convertir une série temporelle irrégulière à une série de temps régulier

mais il ne fonctionne pas pour les données avec une fréquence de 23 (à savoir 23 valeurs par an). Je pense que je pourrais le résoudre en évitant de jeu dd$DATUM as.Date() mais comme un objet zoo qui peut être commandé comme une série chronologique avec 23 valeurs par an.

Toutes les idées?

Merci pour votre aide

Était-ce utile?

La solution

23 ne dans le répartir également le nombre de jours dans une année de sorte que vous devrez synthétiser votre propre échelle de temps de sorte que chaque année est divisée en 23 morceaux égaux. Convertir dd (la version qui a « Date » temps de classe) au zoo et créer une nouvelle série basée sur une nouvelle échelle composée de l'année en plus d'une fraction. Enfin convertir en une série 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)

donner:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top