Shiny R: Подмножество строк в кадре данных - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь запускать модели по определенным уровням факторов или группам этих уровней с помощью виджета выбора ввода в Shiny.

Когда я делаю ставку на один факторный уровень, я получаю правильные результаты модели.Но когда я пытаюсь запустить модель, которая включает все уровни факторов или группы уровней, я не получаю правильные оценки модели.

Например, правильные оценки модели, когда включены все уровни факторов (т. Е. Модель выполняется по всему фрейму данных): enter image description here

Но когдаЯ запускаю свое приложение и выбираю все уровни моей факторной переменной, которая представляет разные географические регионы, я получаю разные результаты: enter image description here

У меня вопрос, как я могу указать свой реактивный саб-установка функции для учета всех уровней факторов или групп уровней?

Код для отдельных моделей, который включает все уровни и модели по факторному уровню для справки:

library(mlogit)
data("Heating", package = "mlogit")
mlogit(depvar ~ ic + oc | 0, data= Heating, shape = "wide", choice = "depvar", varying = c(3:12))
mlogit(depvar ~ ic + oc | 0, data= Heating[Heating$region=="ncostl" , ], shape = "wide", choice = "depvar", varying = c(3:12))
mlogit(depvar ~ ic + oc | 0, data= Heating[Heating$region=="scostl" , ], shape = "wide", choice = "depvar", varying = c(3:12))
mlogit(depvar ~ ic + oc | 0, data= Heating[Heating$region=="mountn" , ], shape = "wide", choice = "depvar", varying = c(3:12))
mlogit(depvar ~ ic + oc | 0, data= Heating[Heating$region=="valley" , ], shape = "wide", choice = "depvar", varying = c(3:12))

Блестящий код:

### PART 1 - Load Libraries and Data
library(shiny)           # For running the app
library(mlogit)

#### data
data("Heating", package = "mlogit")

#### PART 2 - Define User Interface for application
ui <- fluidPage(

  ## Application title
  titlePanel("Housing Preference"),

  ## Sidebar with user input elements
  sidebarLayout(
    sidebarPanel(
      p("Select the inputs"), # Header
      # Speciality
      selectInput('regiontype', 'Region', choices = c("northern coastal region"= "ncostl", 
                                               "southern coastal region" = "scostl", 
                                               "mountain region"  = "mountn",
                                               "central valley region"= "valley"), multiple=TRUE, selectize=TRUE)

    ),

    ## Show a plot
    mainPanel(
      verbatimTextOutput("summary")
    )
  )
)

#### PART 3 - Define server logic required to run calculations and draw plots
server <- function(input, output) {

  output$summary <- renderPrint({

    df <- Heating

    ### Subset data
    df.subset <- reactive({ a <- subset(df, region == input$regiontype)
    return(a)})

    ### Model 
    estimates <- mlogit(depvar ~ ic + oc | 0, data= df.subset(), shape = "wide", choice = "depvar", varying = c(3:12))
    summary(estimates)


  })
}

### PART 4 - Run the application 
shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 25 апреля 2018

Проблема в том, что вы используете == в подмножестве.

Давайте посмотрим на ваши данные:

table(Heating$region)

#> valley scostl mountn ncostl 
#>    177    361    102    260 

900 строк, scostl и ncostl учетная записьза 621 из ваших рядов.Однако, когда я передаю подмножество, передающее вектор совпадений, возвращается только 305.

nrow(subset(Heating, region == c("ncostl","scostl")))
#> [1] 305

Что случилось?Почему не 621? Утилизация векторов кусает вас здесь.Поскольку Heating$region и c("ncostly","scostl") не имеют одинаковую длину, более короткий повторяется, пока они не будут одинаковой длины.Таким образом, вы фактически фильтруете шаблон ncostl, scostl и возвращаете эти совпадения.

Вместо этого вы хотите использовать оператор %in%.

nrow(subset(Heating, region %in% c("ncostl","scostl")))
#> [1] 621

Сейчаснет повторного использования вектора, потому что каждый элемент Heating$region проверяется на членство в списке, который вы предоставляете.

Причина, по которой вы получаете вектор, заключается в том, что он выводится из кратного selectInput в блестящем.

...