#r #shiny #arima #forecast
#r #блестящий #arima #прогноз
Вопрос:
Я работал над блестящим приложением, которое использует auto.arima()
из пакета вместе с xreg
параметром. По какой-то причине xreg
функция (которая принимает фрейм данных или матрицу) перестала принимать выходные данные реактивной функции, которая является подмножеством фрейма данных. Обходной путь отстой, и поэтому я надеюсь, что кто-то знает хороший способ исправить это.
Shiny выдает эту ОШИБКУ:
xreg должен быть числовой матрицей или вектором
Я пробовал:
- повторная установка: forecast, shiny, dplyr, завершение очистки наших R и Rstudio и повторная установка с нуля.
- Я попытался откатить пакет прогнозов до сборки с 6 месяцев назад (когда это работало)
- Я пытался откатить R до сборки с 6 месяцев назад (когда это работало)
- Я пробовал использовать другие пакеты прогнозов; например, bsts, похоже, работает просто отлично
Это какой-то минимально жизнеспособный блестящий код. Создайте файл .csv с 3 столбцами данных, обязательно назовите столбцы, например y
, x1
и x2
.
library(shiny)
library(forecast)
library(dplyr)
ui <- fluidPage(
# Application title
titlePanel("arima test"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
# Input: Select a file ----
fileInput("uploaded_file", "Choose CSV File",
multiple = TRUE,
accept = c("text/csv",
"text/comma-separated-values,text/plain",
".csv")),
uiOutput("dv_dropdown"),
uiOutput("iv_checkbox")
),
# Show a plot of the generated distribution
mainPanel(
verbatimTextOutput("model"),
tableOutput('data')
)
)
)
server <- function(input, output) {
# Read .csv file ----
df <- reactive({
req(input$uploaded_file)
read.csv(input$uploaded_file$datapath,
header = TRUE)
})
# Dynamically generate a list of the dependent variables for the user to choose from the uploaded .csv ----
output$dv_dropdown <- renderUI({
selectInput(inputId = "select_dependents",
label = "dependent time series:",
choices = names(df()[,c(-1)])
)
})
# Dynamically generate a list of the independent variables for the user to choose ----
output$iv_checkbox <- renderUI({
checkboxGroupInput(inputId = "select_ivs",
label = "Select Independent variables:",
choices = setdiff(names(df()[,c(-1)]), input$select_dependents),
selected = setdiff(names(df()), input$select_dependents))
})
####### CREATE REACTIVE DATA OBJECTS BASED ON FILTERS #################
# this creates a dataframe of the dependent time series
df_sel <- reactive({
req(input$select_dependents)
df_sel <- df() %>% select(input$select_dependents)
})
# this creates a dataframe of the dependent time series
df_indep <- reactive({
req(input$select_ivs)
df_indep <- df() %>% select(input$select_ivs)
})
#proof that the independent variables are in fact in a matrix/dataframe
output$data <- renderTable({
df_indep()
})
#This is the TEST ARIMA Model
modela <- reactive({
modela <- auto.arima(df_sel(), xreg = df_indep()) #model with regressors
#modela <- auto.arima(df_sel()) #model without regressors to demonstrate that it actually works without the xreg argument
})
#this is the solution to the xreg problem above, but there's no reason I can think of that xreg shouldn't be able to take a reactive data object like it was doing before...
#x = as.matrix(as.data.frame(lapply(df_indep(), as.numeric)))
# then set: xreg = x
output$model <- renderPrint({
summary(modela())
})
}
# Run the application
shinyApp(ui = ui, server = server)
Комментарии:
1. Вы уверены, что это не
NULL
так? Я предлагаю вам добавитьbrowser()
в качестве первой строкиmodela <- reactive({ ... })
и посмотреть, какdf_indep()
это выглядит. Если этоNULL
так, и это вызывает ошибку, рассмотрите возможность добавленияreq(df_indep())
в качестве первой строки, что предотвратит попытку запуска этого реактивного блока до тех пор, покаdf_indep()
он не станет «правдивым» (см.?req
, что это значит).2. Я только что попробовал req(df_indep()); тот же эффект. Я пытаюсь понять, как прочитать вывод браузера ()
3. кроме того, вывод таблицы здесь: #доказательство того, что независимые переменные на самом деле находятся в выводе матрицы / фрейма данных $data <- renderTable({ df_indep() }) показывает, что объект df_indep() не равен нулю.
4.Когда вы разместили
browser()
в начале этого реактивного блока, confirmeddf_indep()
был не-NULL
и структурирован, как вы ожидаете, а затем запущенauto.arima(df_sel(), xreg = df_indep())
вручную, сработало ли это? Если нет, то этот вопрос может не иметь ничего общего сshiny
вашими данными и / или с тем, как процесс обрабатывает различные угловые случаи.5. решено! блестящий. df_indep <- df() %>% select(ввод$select_ivs) %>% as.matrix() большое вам спасибо! Так что я могу предположить, возможно, обновление пакета dplyr, возможно?