2015-01-16 3 views
2

Я работаю над несколькими анализами, в которых я хотел бы прогнозировать некоторое числовое значение для каждого уровня фактора или даже нескольких факторов, например. состояние пола и возраста. Мой процесс до сих пор был довольно ручным, что-то вроде ниже, что отлично подходит для одной переменной/фактора с 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') 
+0

Мне кажется, что большая часть вашего кода может быть завернута в функцию, которая принимает 'vec' (например,' dt [category == 'A'] $ amount') и возвращает соответствующий 'fcastdf'. Затем для данного списка 'vec' вы сможете использовать 'lapply' и' as.data.frame' для получения желаемого результата. –

+0

Спасибо за ответ. Вы правы, и я начну там, поскольку он решает, вероятно, 90% моей проблемы. Последнее осложнение заключается в желании автоматизировать даже процесс выбора и создания этих начальных векторов, поскольку мне может потребоваться создать более 50, если у меня будет достаточно «срезов». – efh0888

+0

Я предполагаю, что больше знаний о наборе входных данных, а также в процессе выбора может сделать этот процесс более простым. Может быть, вы хотите выполнить прогноз для каждой категории в своем наборе данных? Затем вы можете «расплавить» свои данные и использовать что-то 'dlply' из пакета' plyr' или аналогичные инструменты из пакетов 'dplyr' или' data.table' (думаю, последний может быть вашим выбором, поскольку вы уже используете Таблица данных). –

ответ

0

Вы можете сделать это с tapply:

res <- tapply(amount, category, function(x) { 
    ts <- ts(x, start = start, frequency = 12) 
    fit <- auto.arima(ts, trace = TRUE, stepwise = FALSE) 
    fcastdf <- forecast(fit, h = h) 
    return(fcastdf) 
    }) 

Это вернет именованный список прогнозов.

Вам нужно будет установить старт как самую раннюю дату в вашем наборе данных.

Смежные вопросы