Хранение сложных временных рядов в R - PullRequest
7 голосов
/ 02 мая 2011

У меня есть датафрейм с несколькими столбцами:

  • состояние
  • лен
  • год

Тогда x, y и z, где x, y и z - наблюдения, уникальные для триплета, перечисленного выше. Я ищу разумный способ сохранить это во временном ряду, и xts не позволит мне, так как есть несколько наблюдений для каждого временного индекса. Я посмотрел на пакет hts, но не могу понять, как получить в него свои данные с фрейма данных.

(Да, я написал тот же вопрос на Quora, и мне посоветовали перенести его сюда!)

1 Ответ

8 голосов
/ 02 мая 2011

Один из вариантов - изменить данные, чтобы у вас был столбец для каждой комбинации штат-округ. Это позволяет вам построить матрицу xts:

require(reshape)
Opt1 <- as.data.frame(cast(Data, Date ~ county + State, value="Val"))
rownames(Opt1) <- Opt1$Date
Opt1$Date <- NULL
as.xts(Opt1)

Кроме того, вы можете работать со списком объектов xts, каждый раз проверяя, чтобы у вас был правильный формат, заданный xts. То же самое относится и к любому другому пакету временных рядов. Возможное решение будет:

Opt2 <- 
  with(Data,
    by(Data,list(county,State,year),
      function(x){
        rownames(x) <- x$Date
        x <- x["Val"]
        as.xts(x)
      }
    )
  )

Что позволило бы что-то вроде:

Opt2[["d","b","2012"]]

для выбора определенного временного ряда. Вы можете использовать все опции XTS на этом. Вы можете перебирать графства, штаты и годы, чтобы построить графики, подобные этому:

enter image description here

код участка:

counties <- dimnames(Opt2)[[1]]
states <- dimnames(Opt2)[[2]]
years <- dimnames(Opt2)[[3]]

op <- par(mfrow=c(3,6))
apply(
  expand.grid(counties,states,years),1,
  function(i){
    plot(Opt2[[i[1],i[2],i[3]]],main=paste(i,collapse="-"))
    invisible()
  }
)
par(op)

Тест-данные:

Data <- data.frame( State = rep(letters[1:3],each=90),
            county = rep(letters[4:6],90),
            Date = rep(seq(as.Date("2011-01-01"),by="month",length.out=30),each=3),
            Val = runif(270)
)
Data$year <- as.POSIXlt(Data$Date)$year + 1900
...