Преобразование данных, собранных нерегулярно, во временной ряд в R

#r #time-series

#r #временные ряды

Вопрос:

У меня есть многомерные данные, собранные в течение весеннего и летнего сезонов (месяцы: 5,6,7,8), не обязательно ежедневно, и за 30 лет. Как мне превратить его в объект временных рядов для проведения анализа временных рядов?

Я пробовал: временные ряды <- ts(данные, начало (2017,5), частота = 4)

Но я не знал, какую частоту использовать, поскольку они собираются 4 раза в год, но не в виде «кварталов».

Вот как выглядят данные:

     Year  Month Day   ID     Size      Sex      Temperature
    1 2017     5  13  033     54.0       M        13.0
    2 2017     5  15  044     53.5       F        11.0
    3 2017     5  16  141     55.8       M        15.7
  

Я полагаю, что, возможно, мне придется добавить NAs в данные за месяцы и дни, в которых отсутствуют собранные данные. Я также не знаю, как разделить на день и месяц в год…

Ответ №1:

1) Используя данные, приведенные в примечании в конце (слегка измененные по сравнению с вопросом), создайте серию зоопарка из температуры, время которой год (месяц-5) / 4, уменьшая несколько значений за месяц с помощью mean , а затем преобразуйте все это в ts .

 library(zoo)
toYearMon <- function(x) x[[1]]   (x[[2]] - 5)/4
z <- read.zoo(DF[c("Year", "Month", "Day", "Temperature")], index = 1:3, 
  FUN = toYearMon, aggregate = mean)
as.ts(z)
##      Qtr1 Qtr2
## 2017 12.0 15.7
  

ts будет думать, что 4 месяца — это кварталы, но, надеюсь, вы сможете с этим смириться. Альтернативное использование z .

2) Другая возможность, поскольку с 1 мая по 31 августа включительно 123 дня, заключается в создании переменной времени, которая равна year 0 для 1 мая, year 1/123 для 2 мая, …, year 122/123 для 31 августа.

 toDate <- function(x) as.Date(paste(x[[1]], x[[2]], x[[3]], sep = "-"))

sinceMay1 <- function(x) {
  d <- toDate(x)
  may1 <- toDate(data.frame(x[[1]], 5, 1))
  x[[1]]   as.numeric(d - may1) / 123
}

zsm <- read.zoo(DF[c("Year", "Month", "Day", "Temperature")], index = 1:3,
  FUN = sinceMay1)
frequency(zsm) <- 123
  

и теперь мы можем использовать zsm или as.ts(zsm)

3) другая возможность, если она достаточно хороша для использования 1, 2, 3, … для времени:

 ts(DF$Temperature)
  

4) Мы можем создать серию зоопарка, подобную этой, где ToDate находится сверху:

 read.zoo(DF[c("Year", "Month", "Day", "Temperature")], index = 1:3,
  FUN = toDate)
  

Примечание

Мы изменили последний месяц на 6.

 Lines <- "Year  Month Day   ID     Size      Sex      Temperature
    1 2017     5  13  033     54.0       M        13.0
    2 2017     5  15  044     53.5       F        11.0
    3 2017     6  16  141     55.8       M        15.7"
DF <- read.table(text = Lines)
  

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

1. Спасибо, это полезно, но знаете ли вы какой-либо способ без необходимости превращать ежедневные данные в «квартальные»? Я боюсь, что могу потерять тенденцию, если я просто усредняю ежедневные данные за месяц…

2. Я добавил больше возможностей. Если ни одно из них не является тем, чего вы хотите, вам нужно будет гораздо более подробно рассказать о том, чего именно вы хотите. Обратите внимание, что серии ts обычно не используются для ежедневных данных.

3. Можете ли вы также перейти на «еженедельно»?

4. Замените toYearMon на тот, который преобразуется в неделю.