¿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, 6 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
yvalid.prop
es mayor que 1. Si es así, establecemostrain.prop
en 0,6 yvalid.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 bibliotecatidyverse
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 utilizasample_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