Как создать скользящие прогнозы, сгруппированные по подмножеству с неравномерными и отсутствующими данными?

#r #dataframe #time-series #forecasting #holtwinters

#r #фрейм данных #временные ряды #прогнозирование #холтвинтерс

Вопрос:

У меня есть набор данных (1,6 млн строк, 4 интересующих столбца), организованный по диаде стран-год. Каждая некоммутативная диада (year1-StateA-StateB не всегда равна year1-StateB-StateA) имеет выходное значение ‘var1’.

Упрощенный пример данных

 library(forecast)
library(dplyr)

df=data.frame(year=c(1994,1995,1996,1997,1998,1964,1965,1967,1968,1969,1988,1987,1988,1989),
          stateA=c(1,1,1,1,1,138,138,138,138,138,20,20,20,20),
          stateB=c(2,2,2,2,2,87,87,87,87,87,55,55,55,55),
          var1=c(0.101,0.132,0.136,0.136,0.148,-0.287,-0.112,0.088,0.101,0.121,0.387,NA,0.377,0.388)
)

> df
   year stateA stateB   var1
1  1994      1      2  0.101
2  1995      1      2  0.132
3  1996      1      2  0.136
4  1997      1      2  0.136
5  1998      1      2  0.148
6  1964    138     87 -0.287
7  1965    138     87 -0.112
8  1967    138     87  0.088
9  1968    138     87  0.101
10 1969    138     87  0.121
11 1988     20     55  0.387
12 1987     20     55     NA
13 1988     20     55  0.377
14 1989     20     55  0.388
 

Что я хотел бы сделать, так это разбить каждый набор диад стран на временные ряды и создать прогнозный прогноз с использованием модели Холта на следующий год, используя данные за последние 5 лет.

Ожидаемый результат: я надеюсь добавить новую переменную, которая содержит прогнозируемое значение для yearX 1 на основе предыдущих лет, в строку для yearX.

Сложности: Не каждая диада стран существует для каждого года, и за несколько лет нет данных, несмотря на то, что диада стран существует в наборе данных.

Что я сделал до сих пор:

Во-первых, простите меня, я только недавно начал использовать временные ряды в R.

Сначала я использовал dplr для организации данных по годам (чтобы они были в правильном порядке временных рядов), а затем сгруппированы по статьям StateA, StateB

  rolldata <- df %>%
  dplyr::arrange(year) %>% 
  dplyr::group_by(stateA, stateB) %>% [...]
 

То, что я делал раньше, было скользящим средним значением за 5 лет, которое не соответствовало моим потребностям в анализе, так что вот как это выглядело:

 rolldata <- df %>%
  dplyr::arrange(year) %>% 
  dplyr::group_by(stateA, stateB) %>% 
  dplyr::mutate(
    point_5a = zoo::rollmean(var1, k = 5, fill = NA, align='right'))
 

Проблема здесь в том, что мне нужно создать объект временного ряда для каждой строки для передачи holt() , чтобы вывести прогнозируемое значение (fvar).

 dat_ts <- ts(df$var1, start = c(STARTYEAR, 1), end = c(ROWYEAR, 1), frequency = 1)
holt_model <- holt(dat_ts, h = 5)
fvar[i] <-holt_model$x[1]
 

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

P.S. Эффективность не нужна, только результаты.

РЕДАКТИРОВАТЬ: я не думаю, что я был ясен раньше, но моя главная цель — создать объект прогноза для каждой строки, а не для подмножества в целом. В моем примере данные для страны 1 и страны 2: будет представлен прогноз на 1994 год, основанный на временных рядах 1994 года; будет представлен прогноз на 1995 год, основанный на 1994-1995 годах; прогноз на 1996 год, основанный на 1994-1996 годах. Затем то же самое относится и к паре (138, 87), каждая строка имеет свой собственный прогноз.

Ответ №1:

paste соедините столбцы вместе для разделения / применения by . holt предупреждает о действиях, предпринятых из-за пропусков. Вы могли бы интерполировать их, я не уверен, хотя, что вы хотите с ними делать.

 rolldata <- df[order(df$year), ]

library(forecast)
res <- by(rolldata, Reduce(paste, rolldata[c("stateA", "stateB")]), function(x) {
  STARTYEAR <- x$year[1]; ROWYEAR <- x$year[nrow(x)]
  x0 <- x$var1
  x_ts <- ts(x0, start = c(STARTYEAR, 1), end = c(ROWYEAR, 1), frequency = 1)
  holt_mod <- holt(x_ts, h=5)
  holt_mod$x[1]
})
# Warning message:
#   In ets(x, "AAN", alpha = alpha, beta = beta, phi = phi, damped = damped,  :
#            Missing values encountered. Using longest contiguous portion of time series

as.list(res)
# 
 #r #dataframe #time-series #forecasting #holtwinters

 #r #фрейм данных #временные ряды #прогнозирование #холтвинтерс

Вопрос:

У меня есть набор данных (1,6 млн строк, 4 интересующих столбца), организованный по диаде стран-год. Каждая некоммутативная диада (year1-StateA-StateB не всегда равна year1-StateB-StateA) имеет выходное значение 'var1'. Упрощенный пример данных
 library(forecast)
library(dplyr)

df=data.frame(year=c(1994,1995,1996,1997,1998,1964,1965,1967,1968,1969,1988,1987,1988,1989),
          stateA=c(1,1,1,1,1,138,138,138,138,138,20,20,20,20),
          stateB=c(2,2,2,2,2,87,87,87,87,87,55,55,55,55),
          var1=c(0.101,0.132,0.136,0.136,0.148,-0.287,-0.112,0.088,0.101,0.121,0.387,NA,0.377,0.388)
)

> df
   year stateA stateB   var1
1  1994      1      2  0.101
2  1995      1      2  0.132
3  1996      1      2  0.136
4  1997      1      2  0.136
5  1998      1      2  0.148
6  1964    138     87 -0.287
7  1965    138     87 -0.112
8  1967    138     87  0.088
9  1968    138     87  0.101
10 1969    138     87  0.121
11 1988     20     55  0.387
12 1987     20     55     NA
13 1988     20     55  0.377
14 1989     20     55  0.388
 

Что я хотел бы сделать, так это разбить каждый набор диад стран на временные ряды и создать прогнозный прогноз с использованием модели Холта на следующий год, используя данные за последние 5 лет.

Ожидаемый результат: я надеюсь добавить новую переменную, которая содержит прогнозируемое значение для yearX 1 на основе предыдущих лет, в строку для yearX.

Сложности: Не каждая диада стран существует для каждого года, и за несколько лет нет данных, несмотря на то, что диада стран существует в наборе данных.

Что я сделал до сих пор:

Во-первых, простите меня, я только недавно начал использовать временные ряды в R.

Сначала я использовал dplr для организации данных по годам (чтобы они были в правильном порядке временных рядов), а затем сгруппированы по статьям StateA, StateB

  rolldata <- df %>%
  dplyr::arrange(year) %>% 
  dplyr::group_by(stateA, stateB) %>% [...]
 

То, что я делал раньше, было скользящим средним значением за 5 лет, которое не соответствовало моим потребностям в анализе, так что вот как это выглядело:

 rolldata <- df %>%
  dplyr::arrange(year) %>% 
  dplyr::group_by(stateA, stateB) %>% 
  dplyr::mutate(
    point_5a = zoo::rollmean(var1, k = 5, fill = NA, align='right'))
 

Проблема здесь в том, что мне нужно создать объект временного ряда для каждой строки для передачи holt() , чтобы вывести прогнозируемое значение (fvar).

 dat_ts <- ts(df$var1, start = c(STARTYEAR, 1), end = c(ROWYEAR, 1), frequency = 1)
holt_model <- holt(dat_ts, h = 5)
fvar[i] <-holt_model$x[1]
 

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

P.S. Эффективность не нужна, только результаты.

РЕДАКТИРОВАТЬ: я не думаю, что я был ясен раньше, но моя главная цель - создать объект прогноза для каждой строки, а не для подмножества в целом. В моем примере данные для страны 1 и страны 2: будет представлен прогноз на 1994 год, основанный на временных рядах 1994 года; будет представлен прогноз на 1995 год, основанный на 1994-1995 годах; прогноз на 1996 год, основанный на 1994-1996 годах. Затем то же самое относится и к паре (138, 87), каждая строка имеет свой собственный прогноз.

Ответ №1:

paste соедините столбцы вместе для разделения / применения by . holt предупреждает о действиях, предпринятых из-за пропусков. Вы могли бы интерполировать их, я не уверен, хотя, что вы хотите с ними делать.

1 2`
# [1] 0.101
#
#

#r #dataframe #time-series #forecasting #holtwinters

#r #фрейм данных #временные ряды #прогнозирование #холтвинтерс

Вопрос:

У меня есть набор данных (1,6 млн строк, 4 интересующих столбца), организованный по диаде стран-год. Каждая некоммутативная диада (year1-StateA-StateB не всегда равна year1-StateB-StateA) имеет выходное значение 'var1'.

Упрощенный пример данных

 library(forecast)
library(dplyr)

df=data.frame(year=c(1994,1995,1996,1997,1998,1964,1965,1967,1968,1969,1988,1987,1988,1989),
          stateA=c(1,1,1,1,1,138,138,138,138,138,20,20,20,20),
          stateB=c(2,2,2,2,2,87,87,87,87,87,55,55,55,55),
          var1=c(0.101,0.132,0.136,0.136,0.148,-0.287,-0.112,0.088,0.101,0.121,0.387,NA,0.377,0.388)
)

> df
   year stateA stateB   var1
1  1994      1      2  0.101
2  1995      1      2  0.132
3  1996      1      2  0.136
4  1997      1      2  0.136
5  1998      1      2  0.148
6  1964    138     87 -0.287
7  1965    138     87 -0.112
8  1967    138     87  0.088
9  1968    138     87  0.101
10 1969    138     87  0.121
11 1988     20     55  0.387
12 1987     20     55     NA
13 1988     20     55  0.377
14 1989     20     55  0.388
 

Что я хотел бы сделать, так это разбить каждый набор диад стран на временные ряды и создать прогнозный прогноз с использованием модели Холта на следующий год, используя данные за последние 5 лет.

Ожидаемый результат: я надеюсь добавить новую переменную, которая содержит прогнозируемое значение для yearX 1 на основе предыдущих лет, в строку для yearX.

Сложности: Не каждая диада стран существует для каждого года, и за несколько лет нет данных, несмотря на то, что диада стран существует в наборе данных.

Что я сделал до сих пор:

Во-первых, простите меня, я только недавно начал использовать временные ряды в R.

Сначала я использовал dplr для организации данных по годам (чтобы они были в правильном порядке временных рядов), а затем сгруппированы по статьям StateA, StateB

  rolldata <- df %>%
  dplyr::arrange(year) %>% 
  dplyr::group_by(stateA, stateB) %>% [...]
 

То, что я делал раньше, было скользящим средним значением за 5 лет, которое не соответствовало моим потребностям в анализе, так что вот как это выглядело:

 rolldata <- df %>%
  dplyr::arrange(year) %>% 
  dplyr::group_by(stateA, stateB) %>% 
  dplyr::mutate(
    point_5a = zoo::rollmean(var1, k = 5, fill = NA, align='right'))
 

Проблема здесь в том, что мне нужно создать объект временного ряда для каждой строки для передачи holt() , чтобы вывести прогнозируемое значение (fvar).

 dat_ts <- ts(df$var1, start = c(STARTYEAR, 1), end = c(ROWYEAR, 1), frequency = 1)
holt_model <- holt(dat_ts, h = 5)
fvar[i] <-holt_model$x[1]
 

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

P.S. Эффективность не нужна, только результаты.

РЕДАКТИРОВАТЬ: я не думаю, что я был ясен раньше, но моя главная цель - создать объект прогноза для каждой строки, а не для подмножества в целом. В моем примере данные для страны 1 и страны 2: будет представлен прогноз на 1994 год, основанный на временных рядах 1994 года; будет представлен прогноз на 1995 год, основанный на 1994-1995 годах; прогноз на 1996 год, основанный на 1994-1996 годах. Затем то же самое относится и к паре (138, 87), каждая строка имеет свой собственный прогноз.

Ответ №1:

paste соедините столбцы вместе для разделения / применения by . holt предупреждает о действиях, предпринятых из-за пропусков. Вы могли бы интерполировать их, я не уверен, хотя, что вы хотите с ними делать.

138 87`
# [1] -0.287
#
#

#r #dataframe #time-series #forecasting #holtwinters

#r #фрейм данных #временные ряды #прогнозирование #холтвинтерс

Вопрос:

У меня есть набор данных (1,6 млн строк, 4 интересующих столбца), организованный по диаде стран-год. Каждая некоммутативная диада (year1-StateA-StateB не всегда равна year1-StateB-StateA) имеет выходное значение 'var1'.

Упрощенный пример данных

 library(forecast)
library(dplyr)

df=data.frame(year=c(1994,1995,1996,1997,1998,1964,1965,1967,1968,1969,1988,1987,1988,1989),
          stateA=c(1,1,1,1,1,138,138,138,138,138,20,20,20,20),
          stateB=c(2,2,2,2,2,87,87,87,87,87,55,55,55,55),
          var1=c(0.101,0.132,0.136,0.136,0.148,-0.287,-0.112,0.088,0.101,0.121,0.387,NA,0.377,0.388)
)

> df
   year stateA stateB   var1
1  1994      1      2  0.101
2  1995      1      2  0.132
3  1996      1      2  0.136
4  1997      1      2  0.136
5  1998      1      2  0.148
6  1964    138     87 -0.287
7  1965    138     87 -0.112
8  1967    138     87  0.088
9  1968    138     87  0.101
10 1969    138     87  0.121
11 1988     20     55  0.387
12 1987     20     55     NA
13 1988     20     55  0.377
14 1989     20     55  0.388
 

Что я хотел бы сделать, так это разбить каждый набор диад стран на временные ряды и создать прогнозный прогноз с использованием модели Холта на следующий год, используя данные за последние 5 лет.

Ожидаемый результат: я надеюсь добавить новую переменную, которая содержит прогнозируемое значение для yearX 1 на основе предыдущих лет, в строку для yearX.

Сложности: Не каждая диада стран существует для каждого года, и за несколько лет нет данных, несмотря на то, что диада стран существует в наборе данных.

Что я сделал до сих пор:

Во-первых, простите меня, я только недавно начал использовать временные ряды в R.

Сначала я использовал dplr для организации данных по годам (чтобы они были в правильном порядке временных рядов), а затем сгруппированы по статьям StateA, StateB

  rolldata <- df %>%
  dplyr::arrange(year) %>% 
  dplyr::group_by(stateA, stateB) %>% [...]
 

То, что я делал раньше, было скользящим средним значением за 5 лет, которое не соответствовало моим потребностям в анализе, так что вот как это выглядело:

 rolldata <- df %>%
  dplyr::arrange(year) %>% 
  dplyr::group_by(stateA, stateB) %>% 
  dplyr::mutate(
    point_5a = zoo::rollmean(var1, k = 5, fill = NA, align='right'))
 

Проблема здесь в том, что мне нужно создать объект временного ряда для каждой строки для передачи holt() , чтобы вывести прогнозируемое значение (fvar).

 dat_ts <- ts(df$var1, start = c(STARTYEAR, 1), end = c(ROWYEAR, 1), frequency = 1)
holt_model <- holt(dat_ts, h = 5)
fvar[i] <-holt_model$x[1]
 

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

P.S. Эффективность не нужна, только результаты.

РЕДАКТИРОВАТЬ: я не думаю, что я был ясен раньше, но моя главная цель - создать объект прогноза для каждой строки, а не для подмножества в целом. В моем примере данные для страны 1 и страны 2: будет представлен прогноз на 1994 год, основанный на временных рядах 1994 года; будет представлен прогноз на 1995 год, основанный на 1994-1995 годах; прогноз на 1996 год, основанный на 1994-1996 годах. Затем то же самое относится и к паре (138, 87), каждая строка имеет свой собственный прогноз.

Ответ №1:

paste соедините столбцы вместе для разделения / применения by . holt предупреждает о действиях, предпринятых из-за пропусков. Вы могли бы интерполировать их, я не уверен, хотя, что вы хотите с ними делать.

20 55`
# [1] 0.387

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

1. Спасибо за ваш ответ, и я приношу извинения за задержку с ответом. Редактируя свой пост, я надеялся получить прогноз для каждой строки на основе этого года и предшествующих ему для каждого уникального набора пар стран. Поэтому я не думаю, что эта паста была бы лучшей. Есть ли у вас какие-либо другие решения? Спасибо.

Ответ №2:

Вы можете сохранить объект класса forecast в самом dataframe и извлечь из него соответствующие значения.

 library(dplyr)
library(purrr)
library(forecast)

df %>%
  arrange(year) %>% 
  group_by(stateA, stateB) %>%
  summarise(ts = list(ts(var1, start = c(min(year), 1), 
                               end = c(max(year), 1), frequency = 1)), 
            holt = map(ts, holt, h = 5), 
            all_value = map(holt, ~.x$x),
            first_value = map_dbl(all_value, first)) %>%
    ungroup

#  stateA stateB ts       holt       all_value first_value
#   <dbl>  <dbl> <list>   <list>     <list>          <dbl>
#1      1      2 <ts [5]> <forecast> <ts [5]>        0.101
#2     20     55 <ts [3]> <forecast> <ts [2]>        0.387
#3    138     87 <ts [6]> <forecast> <ts [6]>       -0.287
 

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

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

2. Я не понимаю. Если вы хотите делать это каждый год, будет ли добавление year в group_by справке? Есть много лет для пары, где у вас есть только 1 наблюдение, так что в этом случае это не сработает. Более того, start и end оф ts был бы таким же.

3. В моем примере данных для страны «1» и страны «2»: был бы прогноз на 1994 год, основанный на временных рядах 1994 года; был бы прогноз на 1995 год, основанный на 1994-1995 годах; прогноз на 1996 год, основанный на 1994-1996 годах; прогноз на 1997 год, основанный на 1994-1997 годах … и т.д. Это проясняет ситуацию? Примерные данные очень ограничены, но в моем фактическом наборе данных каждой паре стран обычно около 30-60 лет.