Hola de nuevo. Me ha costado pero ahora entiendo la confusión. Cuando hago una tabla enfrentando lo observado con lo predicho por un análisis (rpart en este caso) la clasificación mantiene las categorías originales, por lo que la tabla es cuadrada y la diagonal de prop.table(variable objetivo, predicción) recoge los porcentajes de clasificaciones correctas. El problema surge cuando las predicciones vienen de un loop (un leave one out en este caso) en el que se almacenan las predicciones. Las categorías sin predicciones no son contempladas, y al hacer la tabla, ya no es cuadrada. Os lo copio por si alguien sabe cómo hacer que incluya las categorías sin casos predichos. preds <- c(0) # creamos un vector vacío for (i in 1:nrow(data)) { training <- data[-i, ] fitrp <- rpart(FAMILY ~ .,data=training, cp=cpopt) Pred <- predict(fitrp,data[i,], type="class") preds[i] <- as.character(Pred) } data$preds<- as.factor(preds) tabrp<-table(data$FAMILY,data$preds); tabrp # Tabla de contingencia en valores absolutos tabprc<-round(100*(prop.table(tabrp,1)),0); tabprc # Tabla de contingencia en porcentajes Gracias, Manuel> El sáb, 26 feb 2022 a las 1:19, Manuel Mendoza (< > mmendoza en fulbrightmail.org>) escribió: > >> Buenos días, obtengo una Tabla de contingencia con: >> tabrp<-table(variable objetivo, predicción) >> >> y en porcentajes con: >> tabprc<-100*(prop.table(tabrp,1)) >> >> Para sacar los porcentajes de clasificaciones correctas usaba simplemente: >> diag(tabrp) >> >> pero si no todas las categorías de la variable objetivo están en la >> predicción, la diagonal ya no son las clasificaciones correctas. >> >> ¿Sabéis de alguna forma sencilla de obtener esas clasificaciones correctas >> o de algún paquete que te lo dé directamente? >> Gracias, >> Manuel >> >[[alternative HTML version deleted]]
Estimado Manual Mendoza Sin entrar en su caso en particular, puesto que tendría que estudiarlo para poder opinar, le comparto un razonamiento según mi experiencia que podría ser útil. Primero, supongamos A, B, C, que serían las categorías. Luego 100, 150, 200 que serían los observados. Pero entre las categorías y los observados está alpha y betta. Segundo, supongamos que en b no hay betta, pero puede realizar la predicción, por lo que dice que B alpha es 150, y B betta 153. Tercero, en las predicciones al realizar el bucle, toma A y B, no solicita ninguna combinación de C. Cuarto, el problema al continuar está que el punto tercero, donde una categoría (C) no es tenida en cuenta. En mi experiencia, yo realicé algo donde podría tener tantas predicciones, que lo engorroso fué hacer entender la posibilidad, pero que no se podía calcular ni graficar, entraba en algo donde era inmanejable cómo medir todas las estrellas en caso de poder contarlas. En las predicciones con bucles tiene el problema de colocar demasiado o perder una posibilidad por error humano, posiblemente ahí usted tenga un problema, en algún lugar está perdiendo una categoría. Javier Rubén Marcuzzi El sáb, 26 feb 2022 a las 16:40, Manuel Mendoza (<mmendoza en fulbrightmail.org>) escribió:> Hola de nuevo. Me ha costado pero ahora entiendo la confusión. Cuando hago > una tabla enfrentando lo observado con lo predicho por un análisis (rpart > en este caso) la clasificación mantiene las categorías originales, por lo > que la tabla es cuadrada y la diagonal de prop.table(variable objetivo, > predicción) recoge los porcentajes de clasificaciones correctas. > > El problema surge cuando las predicciones vienen de un loop (un leave one > out en este caso) en el que se almacenan las predicciones. Las categorías > sin predicciones no son contempladas, y al hacer la tabla, ya no es > cuadrada. > > Os lo copio por si alguien sabe cómo hacer que incluya las categorías sin > casos predichos. > > preds <- c(0) # creamos un vector vacío > for (i in 1:nrow(data)) { > training <- data[-i, ] > fitrp <- rpart(FAMILY ~ .,data=training, cp=cpopt) > Pred <- predict(fitrp,data[i,], type="class") > preds[i] <- as.character(Pred) > } > data$preds<- as.factor(preds) > tabrp<-table(data$FAMILY,data$preds); tabrp # Tabla de contingencia en > valores absolutos > tabprc<-round(100*(prop.table(tabrp,1)),0); tabprc # Tabla de contingencia > en porcentajes > > Gracias, > Manuel > > > > El sáb, 26 feb 2022 a las 1:19, Manuel Mendoza (< > > mmendoza en fulbrightmail.org>) escribió: > > > >> Buenos días, obtengo una Tabla de contingencia con: > >> tabrp<-table(variable objetivo, predicción) > >> > >> y en porcentajes con: > >> tabprc<-100*(prop.table(tabrp,1)) > >> > >> Para sacar los porcentajes de clasificaciones correctas usaba > simplemente: > >> diag(tabrp) > >> > >> pero si no todas las categorías de la variable objetivo están en la > >> predicción, la diagonal ya no son las clasificaciones correctas. > >> > >> ¿Sabéis de alguna forma sencilla de obtener esas clasificaciones > correctas > >> o de algún paquete que te lo dé directamente? > >> Gracias, > >> Manuel > >> > > > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >[[alternative HTML version deleted]]
Buenas, Creo que la cuestión puede estar aquí data$preds <- as.factor(preds) Supongamos que las clasificaciones correctas están en data$clas, prueba a hacer data$preds <- as.factor(preds, levels = levels(data$clas)) Esto te garantiza que ambos factores tengan los mismos niveles y en el mismo orden y creo que eso es lo que necesitas. Un saludo. El sáb, 26-02-2022 a las 20:39 +0100, Manuel Mendoza escribió:> Hola de nuevo. Me ha costado pero ahora entiendo la confusión. Cuando > hago > una tabla enfrentando lo observado con lo predicho por un análisis > (rpart > en este caso) la clasificación mantiene las categorías originales, > por lo > que la tabla es cuadrada y la diagonal de prop.table(variable > objetivo, > predicción) recoge los porcentajes de clasificaciones correctas. > > El problema surge cuando las predicciones vienen de un loop (un leave > one > out en este caso) en el que se almacenan las predicciones. Las > categorías > sin predicciones no son contempladas, y al hacer la tabla, ya no es > cuadrada. > > Os lo copio por si alguien sabe cómo hacer que incluya las categorías > sin > casos predichos. > > preds <- c(0) # creamos un vector vacío > for (i in 1:nrow(data)) { > training <- data[-i, ] > fitrp <- rpart(FAMILY ~ .,data=training, cp=cpopt) > Pred <- predict(fitrp,data[i,], type="class") > preds[i] <- as.character(Pred) > } > data$preds<- as.factor(preds) > tabrp<-table(data$FAMILY,data$preds); tabrp # Tabla de contingencia > en > valores absolutos > tabprc<-round(100*(prop.table(tabrp,1)),0); tabprc # Tabla de > contingencia > en porcentajes > > Gracias, > Manuel > > > > El sáb, 26 feb 2022 a las 1:19, Manuel Mendoza (< > > mmendoza en fulbrightmail.org>) escribió: > > > > > Buenos días, obtengo una Tabla de contingencia con: > > > tabrp<-table(variable objetivo, predicción) > > > > > > y en porcentajes con: > > > tabprc<-100*(prop.table(tabrp,1)) > > > > > > Para sacar los porcentajes de clasificaciones correctas usaba > > > simplemente: > > > diag(tabrp) > > > > > > pero si no todas las categorías de la variable objetivo están en > > > la > > > predicción, la diagonal ya no son las clasificaciones correctas. > > > > > > ¿Sabéis de alguna forma sencilla de obtener esas clasificaciones > > > correctas > > > o de algún paquete que te lo dé directamente? > > > Gracias, > > > Manuel > > > > > > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es