Я работаю над несколькими анализами, в которых я хотел бы прогнозировать некоторое числовое значение для каждого уровня фактора или даже нескольких факторов, например. состояние пола и возраста. Мой процесс до сих пор был довольно ручным, что-то вроде ниже, что отлично подходит для одной переменной/фактора с 2-5 уровнями. Но он не может быть масштабируемым для условий с множеством уровней или с несколькими факторами.Группировка с пакетом прогнозов в R
Есть ли какие-либо функции «group by» или «subset» в пакете прогнозов, которые помогут? Я начал писать программу для выполнения нижеописанного процесса в наиболее общем случае (т. Е. Для любого количества факторов и уровней), но еще не был слишком успешным.
BTW, к сожалению, мои данные являются частными, и я не могу поделиться им здесь. Но это не имеет особого значения, потому что приведенный ниже код работает, и я ищу лучшее, то есть масштабируемое решение.
# Example code
# category is a factor with levels A and B; amt is the variable to model/forecast
# using data.table syntax to create a vector for each category
vec1 <- dt[category == 'A']$amount
vec2 <- dt[category == 'B']$amount
# Create ts objects from above vectors
ts1 <- ts(vec1, start=c(start_year, start_month), end=c(end_year, end_month), frequency=12)
ts2 <- ts(vec2, start=c(start_year, start_month), end=c(end_year, end_month), frequency=12)
# Fit model
fit1 <- auto.arima(ts1, trace = TRUE, stepwise = FALSE)
fit2 <- auto.arima(ts2, trace = TRUE, stepwise = FALSE)
# Forecast out using selected models
h <- 12
fcast1 <- forecast(fit1, h)
fcast2 <- forecast(fit2, h)
# funggcast pulls out data from the forecast object into a df (needed for ggplot2)
# output columns are date, observed, fitted, forecast, lo80, hi80, lo95, hi95
fcastdf1 <- funggcast(ts1, fcast1)
fcastdf2 <- funggcast(ts2, fcast2)
# Add in category
fcastdf1$category <- 'A'
fcastdf2$category <- 'B'
# Merge into one df
df <- merge(fcastdf1, fcastdf2, all=T)
# Basic qplot from ggplot2 package, I am actually incorporating quite a bit more formatting but this is just to give an idea
qplot(x=date,
y=observed,
data=df,
color=category,
group=category, geom="line") +
geom_line(aes(y=forecast), col='blue')
Мне кажется, что большая часть вашего кода может быть завернута в функцию, которая принимает 'vec' (например,' dt [category == 'A'] $ amount') и возвращает соответствующий 'fcastdf'. Затем для данного списка 'vec' вы сможете использовать 'lapply' и' as.data.frame' для получения желаемого результата. –
Спасибо за ответ. Вы правы, и я начну там, поскольку он решает, вероятно, 90% моей проблемы. Последнее осложнение заключается в желании автоматизировать даже процесс выбора и создания этих начальных векторов, поскольку мне может потребоваться создать более 50, если у меня будет достаточно «срезов». – efh0888
Я предполагаю, что больше знаний о наборе входных данных, а также в процессе выбора может сделать этот процесс более простым. Может быть, вы хотите выполнить прогноз для каждой категории в своем наборе данных? Затем вы можете «расплавить» свои данные и использовать что-то 'dlply' из пакета' plyr' или аналогичные инструменты из пакетов 'dplyr' или' data.table' (думаю, последний может быть вашим выбором, поскольку вы уже используете Таблица данных). –