#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 лет.