Экспоненциальное сглаживание в R и представление с помощью Shiny

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

Первоначально я генерирую случайный набор данных для использования в этом методе, где альфа и количество прогнозируемых периодов определяются пользователем. Например; у меня есть 100 дней, и следующие 4 дня готовы быть оценены с их линиями - подходят, верхние и нижние-. Затем я хочу узнать значения этих данных в виде таблицы.

Когда я пытаюсь визуализировать график, ошибка: ggplot2 не знает, как обращаться с данными класса mtstsmatrix

Во-вторых, я хотел бы отслеживать такие данные, как: введите здесь описание изображения

 require(shiny)
 require(ggplot2)
 require(forecast)
 require(TTR)

 shinyServer(function(input, output, session){

   set.seed(123)
   output$es1 <- renderPlot({ 

  tmp <- data.frame(time = 1:100, sales = round(runif(100, 150, 879)) )
  tmp.mean <- HoltWinters(x=tmp$sales, alpha = input$alpha, beta = FALSE,gamma=FALSE)
  tmp.pred <- predict(tmp.mean,n.ahead = input$h, prediction.interval = TRUE)

 y <- ggplot(tmp, aes(time, sales)) + 
          geom_line() +   
          geom_line(data=tmp.pred, aes(y=tmp.pred[,1]),color="red") +  
          geom_line(data=tmp.pred, aes(y=tmp.pred[,2]),color="blue") + 
          xlab("Days") + 
          ylab("Sales Quantity")+ 
          ggtitle(title)
  y })

 output$infoes <- renderDataTable({ 

tmp <- data.frame(time = 1:100, sales = round(runif(100, 150, 879)) )
tmp.mean <- HoltWinters(x=tmp$sales, alpha = input$alpha, beta = FALSE,gamma=FALSE)
tmp.pred <- predict(tmp.mean,n.ahead = input$h, prediction.interval = TRUE)
tmp.pred

  })

ui

 require(shiny)
 require(ggplot2)
 require(forecast)
 require(TTR)

   shinyUI(pageWithSidebar(    
     headerPanel("Forecasting Methods"),
     sidebarPanel(

   h3(strong("Exponential Smoothing",style = "color:black")),
   br(),
   sliderInput("h","Number of periods for forecasting:",
        min = 1, max = 20,     step= 1, value = 4),
   sliderInput("alpha","Alpha (Smoothing Parameter):",
        min = 0.05, max = 1, step= 0.05, value = 0.01)

    ),

 mainPanel(
    tabsetPanel( id="tabs",
         tabPanel("Exponential Smoothing",
                   value="panel",
                   plotOutput(outputId = "es1",
                   width  = "900px",height = "400px"),
                   dataTableOutput(outputId="infoes"))
    ))))

person can.u    schedule 05.01.2016    source источник
comment
Вам нужно указать проблему, которую нужно исправить. Если можно, выложите скриншот. ТАКЖЕ, если вы генерируете случайные данные, вы должны указать начальное число во время тестирования, чтобы всегда получать одни и те же данные.   -  person Mike Wise    schedule 05.01.2016
comment
Я отредактирую свой пост, чтобы внести ясность.   -  person can.u    schedule 05.01.2016
comment
tmp.pred, вероятно, не является кадром данных, поэтому вы получаете сообщение об ошибке: ggplot2 не знает, как обращаться с данными класса mtstsmatrix   -  person MLavoie    schedule 06.01.2016


Ответы (1)


Вы должны были сделать tmp.pred приемлемым для ggplot, как было сказано в комментариях. Вам также не нужно создавать одни и те же данные в нескольких операторах, для этого подходит команда reactive:

введите здесь описание изображения

ui.R (без изменений)

require(shiny)
require(ggplot2)
require(forecast)
require(TTR)

shinyUI(pageWithSidebar(    
  headerPanel("Forecasting Methods"),
  sidebarPanel(

    h3(strong("Exponential Smoothing",style = "color:black")),
    br(),
    sliderInput("h","Number of periods for forecasting:",
                min = 1, max = 20,     step= 1, value = 4),
    sliderInput("alpha","Alpha (Smoothing Parameter):",
                min = 0.05, max = 1, step= 0.05, value = 0.01)

  ),

  mainPanel(
    tabsetPanel( id="tabs",
                 tabPanel("Exponential Smoothing",
                          value="panel",
                          plotOutput(outputId = "es1",
                                     width  = "900px",height = "400px"),
                          dataTableOutput(outputId="infoes"))
    ))))

сервер.R

require(shiny)
require(ggplot2)
require(forecast)
require(TTR)

shinyServer(function(input, output, session){

  set.seed(123)

  predset <- reactive({
    tmp <- data.frame(time = 1:100, sales = round(runif(100, 150, 879)) )
    tmp.mean <- HoltWinters(x=tmp$sales, alpha = input$alpha, beta = FALSE,gamma=FALSE)
    tmp.pred <- data.frame(predict(tmp.mean,n.ahead = input$h, prediction.interval = TRUE), time = tmp[nrow(tmp), "time"] + 1:input$h)  
    list(tmp = tmp, tmp.pred = tmp.pred)
  })

  output$es1 <- renderPlot({

    tmp <- predset()$tmp
    tmp.pred <- predset()$tmp.pred

    y <- ggplot(tmp, aes(time, sales)) + 
      geom_line() +   
      geom_line(data=tmp.pred, aes(y=upr),color="red") +  
      geom_line(data=tmp.pred, aes(y=fit),color="blue") +
      geom_line(data=tmp.pred, aes(y=lwr),color="red") +
      xlab("Days") + 
      ylab("Sales Quantity")+ 
      ggtitle("title")
    y })

  output$infoes <- renderDataTable({ 
    predset()$tmp.pred
  })
})
person mlegge    schedule 07.01.2016
comment
Вы спасаете мой день. Спасибо!! - person can.u; 08.01.2016