¿Cómo puedo evitar este error de muestra al crear árboles de clasificación en Rshiny?

Estoy trabajando en una tarea ahora mismo para crear una aplicación Rshiny para hacer un par de cosas. Específicamente, estoy teniendo problemas con la creación del árbol de clasificación en la pestaña "herramientas de clasificación", sin tener ningún error.

La salida del árbol de clasificación se supone que depende de una entrada de diapositivas que determina la proporción de datos de entrenamiento que el árbol utiliza. Actualmente, el código casi funciona completamente como 4/5 de las entradas de diapositivas funcionan correctamente para crear una parcela de clasificación. Sin embargo, cuando pongo la diapositiva a 0,5, obtengo el siguiente error: no puede tomar una muestra más grande que la población cuando 'reemplazar = FALSE

Aquí está mi código:

data <- read.csv("Fatality-task2.csv")

data$Rate <- as.factor(data$Rate)

library(shiny)
library(dplyr)
library(ggplot2)
library(markdown)
library(gtsummary)
library(ggdendro)
library(factoextra)
library(mclust)
library(cluster)
library(rpart)
library(rpart.plot)

#################################################################


ui <- fluidPage(
  navbarPage("",
             tabPanel("Data Exploration",
                      sidebarLayout(
                        sidebarPanel(
                          selectInput("variable",
                                      "Variable",
                                      colnames(data)),
                          selectInput("rate",
                                      "Rate",
                                      levels(data$Rate))
                        ),
                        mainPanel(
                          tableOutput("table"),
                          plotOutput("plot")
                        )
                      )
             ),
             tabPanel("Classification tools",
                      sidebarLayout(
                        sidebarPanel(
                          sliderInput("train.prop",
                                      "Training data proportion",
                                      min = 0.4,
                                      max = 0.8,
                                      step = 0.1,
                                      value = 0.6)
                        ),
                        mainPanel(
                          plotOutput("plot2")
                        )
                      )
             )
  )
)




#################################################################


server <- function(input, output) {
  sum <- reactive({
    data <- data %>%
      filter(Rate == input$rate) %>%
      select(input$variable) %>%
      summary() %>%
      as.data.frame() %>%
      tidyr::separate(Freq, c("Stat", "Value"), sep=":") %>%
      tidyr::pivot_wider(names_from =Stat, values_from = Value)
    data <- data[, -c(1,2)]
    
  })
  
  output$plot <- renderPlot({
    if (input$variable == "jaild" | input$variable == "Rate"){
    ggplot(data, aes(x = Rate, fill = .data[[input$variable]])) +
      geom_bar(position = "dodge", width = 0.7) +
        if (input$variable == "Rate"){
          theme(legend.position = "none")
        }
    } else {
      ggplot(data, aes(x = Rate, y = .data[[input$variable]], fill = Rate)) +
        geom_boxplot() +
        theme(legend.position = "none")
    }
    
    
  })
  
  
  output$plot2 <- renderPlot({
    n <- nrow(data)
    ind1 <- sample(c(1:n), round(n*input$train.prop))
    ind2 <- sample(c(1:n)[-ind1], round(n*(1-input$train.prop)))
    
    train.data <- data[ind1,]
    
    valid.data <- data[ind2,]
    
    fit.tree <- rpart(Rate~., data = train.data, method = "class")
    
    rpart.plot(fit.tree)
  })
  

  
  
  
}




#################################################################
shinyApp(ui, server)

El problema se presenta en el código siguiente 'output$plot2 '

Cualquier ayuda sería apreciada, gracias

Pregunta hecha hace 3 años, 5 meses, 0 días - Por logiclinguist


2 Respuestas:

  • El error que estás recibiendo "no puede tomar una muestra más grande que la población cuando 'reemplazar = FALSE" se produce al intentar realizar una muestra sin reemplazo de un tamaño mayor que la población de datos. En tu código, estás intentando realizar una muestra sin reemplazo de los datos de entrenamiento y validación para el árbol de clasificación.

    Para evitar este error, puedes modificar tu código de la siguiente manera:

    • Cambia la línea donde realizas las muestras de datos de entrenamiento y validación para que se permita el reemplazo, añadiendo el parámetro `replace = TRUE` a la función `sample`.
    • Asegúrate de que la suma de las longitudes de las muestras de entrenamiento y validación no sea mayor que el número total de filas en tus datos.

    Aquí tienes la parte relevante de tu código actualizado:

    R
    output$plot2 <- renderPlot({
        n <- nrow(data)
        ind1 <- sample(c(1:n), round(ninput$train.prop), replace = TRUE)
        ind2 <- sample(c(1:n)[-ind1], round(n(1-input$train.prop)), replace = TRUE)
    
        train.data <- data[ind1,]
        valid.data <- data[ind2,]
    
        fit.tree <- rpart(Rate ~ ., data = train.data, method = "class")
    
        rpart.plot(fit.tree)
    })
    

    Con estos cambios, tu código debería evitar el error de muestra más grande que la población al crear árboles de clasificación en Rshiny. ¡Espero que esta solución te sea útil! Si tienes alguna otra pregunta o problema, no dudes en consultarme.

    Respondida el Dec 17, 2020 a las 20:01 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error "no puede tomar una muestra más grande que la población cuando 'reemplazar = FALSE'" ocurre cuando intentas muestrear una cantidad de datos mayor que el tamaño de la población original con reemplazo establecido en FALSO. En tu caso específico, esto está sucediendo porque cuando configuras la diapositiva a 0,5, estás intentando tomar una muestra del 50 % de los datos para los datos de entrenamiento y el 50 % de los datos para los datos de validación. Esto suma un total del 100 %, que es mayor que el tamaño de la población original.

    Para resolver este problema, puedes ajustar el código para asegurarte de que el tamaño de la muestra no sea mayor que el tamaño de la población original. Aquí tienes el código actualizado:

    
    output$plot2 <- renderPlot({
        n <- nrow(data)
    
        train.prop <- input$train.prop
        valid.prop <- 1 - train.prop
    
        if (train.prop + valid.prop > 1) {
          train.prop <- 0.6
          valid.prop <- 0.4
        }
    
        ind1 <- sample(c(1:n), round(ntrain.prop))
        ind2 <- sample(c(1:n)[-ind1], round(nvalid.prop))
    
        train.data <- data[ind1,]
    
        valid.data <- data[ind2,]
    
        fit.tree <- rpart(Rate~., data = train.data, method = "class")
    
        rpart.plot(fit.tree)
      })
    

    En este código actualizado, verificamos si la suma de train.prop y valid.prop es mayor que 1. Si es así, establecemos train.prop en 0,6 y valid.prop en 0,4. Esto garantiza que el tamaño de la muestra no sea mayor que el tamaño de la población original.

    Además, también puedes considerar usar la función sample_n de la biblioteca tidyverse para asegurarte de que el tamaño de la muestra no sea mayor que el tamaño de la población original. Aquí tienes el código actualizado que utiliza sample_n:

    
    output$plot2 <- renderPlot({
        n <- nrow(data)
    
        train.prop <- input$train.prop
        valid.prop <- 1 - train.prop
    
        if (train.prop + valid.prop > 1) {
          train.prop <- 0.6
          valid.prop <- 0.4
        }
    
        ind1 <- sample_n(c(1:n), round(ntrain.prop))
        ind2 <- sample_n(c(1:n)[-ind1], round(nvalid.prop))
    
        train.data <- data[ind1,]
    
        valid.data <- data[ind2,]
    
        fit.tree <- rpart(Rate~., data = train.data, method = "class")
    
        rpart.plot(fit.tree)
      })
    

    Respondida el Dec 17, 2020 a las 20:05 - por Gemini

    Votos positivos: 0 | Votos negativos: 0