Как создать простую модель линейного предсказания в блестящей? - PullRequest
0 голосов
/ 03 апреля 2020

В последнее время я пытаюсь создать интерактивное блестящее приложение. В этом приложении я хочу, чтобы линейная модель предсказывала данное значение пользователем. Кроме того, предиктор и пояснительная переменная могут быть выбраны пользователем. После этого модель просто возвращает прогнозируемое значение, отображаемое приложением. Однако я не могу понять, как позволить приложению использовать существующий фрейм данных и возвращать прогнозируемое значение. При запуске приложения я получаю следующую ошибку:

Warning in storage.mode(v) <- "double" : NAs introduced by coercion
Warning: Error in contrasts<-: contrasts can be applied only to factors with 2 or more levels
[No stack trace available]

Сам скрипт похож на код Шона Кросса (https://seankross.com/developing-data-products/shiny.html#reactivity). Я использовал скрипт, представленный ниже, что привело к ошибке:

librar(shiny)
#Create random data frame with three vectors
df          <- data.frame(V1=1:100, V2=100:1*runif(100, min=0, max=1), V3=1:100*runif(100, min=0, max=1))

ui          <- fluidPage(
  headerPanel("Regression"), 
  sidebarPanel(
    p("Select explanatory variable"),
    selectInput(inputId = "ExpVar", label = "Explanatory variable", choices = colnames(df)),
    p("Select predictor variable"),
    selectInput(inputId = "PreVar", label = "Predictor variable", choices = colnames(df)), 
    numericInput(inputId = "Pred", label = "Predict chosen value", value = 10),
    h3("Prediction"),
    textOutput("prediction")))

server      <- function(input, output){

    modpred <- reactive({
    Pre     <- input$Pred
    Pname   <- input$PreVar
    mod     <- lm(input$PreVar~input$ExpVar, data=df)
    predict(mod, newdata = data.frame(Pname = Pre))})

    output$prediction <- renderText({modpred()})

}

shinyApp(ui, server)

Заранее спасибо за ваше время

1 Ответ

2 голосов
/ 03 апреля 2020

Для этого могут быть разные подходы. Можно использовать varSelectInput и выбрать имена переменных из df в вашем ui (это возвращает символ).

Здесь мы оставляем selectInput и используем строки символов. Перед использованием lm вам нужно будет создать формулу на основе этих строк символов, поскольку они не являются символами.

Для этого вы можете использовать as.formula или reformulate (последнее сделано здесь ). Это сгенерирует вашу формулу (например, V2 ~ V1).

Кроме того, для predict вы захотите, чтобы имя столбца new_df было установлено равным Pname. Предыдущий код будет называть сам столбец Pname вместо строки, которой Pname равен.

modpred <- reactive({
  Pre     <- input$Pred
  Pname   <- input$PreVar
  mod     <- lm(reformulate(input$PreVar, input$ExpVar), data=df)
  new_df  <- data.frame(Pre)
  names(new_df) <- Pname
  predict(mod, newdata = new_df)
})
...