Хранение сложных временных рядов в R

#r #statistics #dataframe #time-series

#r #Статистика #фрейм данных #временные ряды

Вопрос:

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

  • состояние
  • округ
  • год

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

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

Комментарии:

1. можете ли вы показать, что вы уже пробовали?

2. Немного. Когда я попытался вставить это в xts, оно захлебнулось при добавлении имен строк, поскольку имена строк должны быть уникальными. В этом случае на комбинацию штата и округа приходится по строке за каждый год (около 3000). Итак, я смотрю на hts, и кажется, что это уже должен быть xts перед входом. Итак, я немного заблудился.

3. «Временной ряд» — это когда каждая строка соответствует другому времени. Судя по именам ваших столбцов, если только каждый year не относится к другому году, у вас нет временных рядов. Если это так, то вы, вероятно, ищете data.frame . Есть ли причина, по которой вы думаете, что это временной ряд?

4. Да, потому что это примерно 3150 временных рядов, объединенных в одно имя данных. Мой мыслительный процесс чем-то сродни: «конечно, есть объект, который может объединить это и упростить такие вещи, как построение графиков». Обработка этого как data.frame может быть лучшим вариантом.

5. Не могли бы вы предоставить нам несколько примеров данных?

Ответ №1:

Одним из вариантов является изменение формы ваших данных, чтобы у вас был столбец для каждой комбинации штата и округа. Это позволяет вам построить матрицу 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. То же самое относится к любому из других пакетов timeseries. Возможным решением было бы :

 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. Вы можете перебирать округа, штаты и годы для построения графиков, подобных этому :

введите описание изображения здесь

Код для построения графика :

 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
  

Комментарии:

1. Я неравнодушен к подходу «список объектов xts». Я считаю, что работать со списками намного проще, чем отслеживать столбцы. Но многим людям, работающим в сфере электронных таблиц, нравится формат wide data, потому что его можно представить как электронную таблицу.

2. @JD Long : зависит от того, как вы хотите видеть данные. Если вы используете широкий формат, у вас есть временной ряд с несколькими переменными. Если вы используете список, у вас есть целый набор временных рядов только с одной переменной. Вот почему я предоставил оба варианта.

3. Я планирую опробовать оба варианта и посмотреть, что работает для меня лучше всего на практике. Вероятно, поэтому я так взволнован вышеупомянутым сообщением.