How can I solve Error in `[.data.frame`(newdata, , object$model.list$variables) : undefined columns selected when building an Artificial Neural Network?

# LIBRERIAS Y DATOS 
library(neuralnet)
library(ggplot2)
library(readxl)
options(java.parameters = "-Xmx4g" )

#Objetos aleatorios: 
set.seed(65)

### Aquí, generamos nuestra tabla de datos a partir de los valores anteriores:
squads<-tibble::tribble(
          ~Parto, ~Sexo, ~Pesoi, ~Peso1, ~Peso2, ~Peso3, ~Peso4, ~Peso5, ~Peso6,
              1,    1,    3.7,      5,   6.15,   7.45,   8.25,    9.1,  10.65,
              2,    1,   3.15,   4.75,    5.8,   6.45,    7.3,    8.4,    9.1,
              3,    2,   3.55,    4.7,    5.9,    6.7,   8.15,   9.55,  11.15,
              1,    2,   3.65,   4.85,    5.7,   6.65,   7.65,    9.5,   10.5,
              2,    2,   3.75,      5,   6.15,    7.3,   7.85,    9.6,   10.7,
              3,    2,   4.25,   5.35,   6.35,      8,    9.4,  11.45,   12.7
          )
head(squads)
datos <- head(squads) 
n        <- nrow(datos) ###Contabiliza el número de filas

# Toma una muestra aleatoria: 
muestra  <- sample(n, n * .70) 
# Matriz de entrenamiento
train    <- datos[muestra, ] 
# Matriz de prueba
test     <- datos[-muestra, ] 

#Normalizamos las variables: 
maxs      <- apply(train, 2, max) #valores maximos para el entrenamiento
mins      <- apply(train, 2, min) #valores manimos para el entrenamiento
datos_nrm <- as.data.frame(scale(datos, center = mins, scale = maxs - mins))
train_nrm <- datos_nrm[muestra, ]
test_nrm  <- datos_nrm[-muestra, ]
nms  <- names(train_nrm)
frml <- as.formula(paste("Peso1+Peso2+Peso3+Peso4+Peso5+Peso6 ~",
                         paste(nms[!nms %in% "Peso1+Peso2+Peso3+Peso4+Peso5+Peso6"],collapse = " + ")))
# MODELO
modelo.nn <- neuralnet(frml,
                       data          = train_nrm,
                       hidden        = c(4),
                       threshold     = 0.01,
                       algorithm     = "rprop+",
                       learningrate = 0.005,)
#Generamos: 
modelo.nn

# PREDICCION
pr.nn   <- compute(modelo.nn,within(test_nrm,rm(Peso1,Peso2,Peso3,Peso4,Peso5,Peso6)))

En esta ultima linea me sale el error: Error in [.data.frame(newdata, , object$model.list$variables) : undefined columns selected

Se transoforma el valor escalar al valor nominal original

Aqui ya insertamos todas nuestras variables de salida para poder general nuestros valores:

peso.predict <- (pr.nn$net.result*(max(datos$Peso1)-min(datos$Peso1))+min(datos$Peso1))+
((max(datos$Peso2)-min(datos$Peso2))+min(datos$Peso2))+
((max(datos$Peso3)-min(datos$Peso3))+min(datos$Peso3))+
((max(datos$Peso4)-min(datos$Peso4))+min(datos$Peso4))+
((max(datos$Peso5)-min(datos$Peso5))+min(datos$Peso5))+
((max(datos$Peso6)-min(datos$Peso6))+min(datos$Peso6))
peso.predict
peso.real <- ((test_nrm$Peso1)*(max(datos$Peso1)-min(datos$Peso1))+min(datos$Peso1))+
((max(datos$Peso2)-min(datos$Peso2))+min(datos$Peso2))+
((max(datos$Peso3)-min(datos$Peso3))+min(datos$Peso3))+
((max(datos$Peso4)-min(datos$Peso4))+min(datos$Peso4))+
((max(datos$Peso5)-min(datos$Peso5))+min(datos$Peso5))+
((max(datos$Peso6)-min(datos$Peso6))+min(datos$Peso6))
#Generamos:
peso.real

Hallamos la suma de error cuadrático:

-----------------------------------------------------

se.nn <- sum((peso.real- peso.predict)^2)/nrow(test_nrm)
se.nn

#Generamos nuestra red neuronal:

-----------------------------------------------

Graficamos:

qqplot(x=peso.real, y=peso.predict, geom=c("point","smoth"), method="lm",
main=paste(" Real Vs Prediccion\nSuma de Error Cuadratico=",round(se.nn,2)))

Red

plot(modelo.nn)

Se transoforma el valor escalar al valor nominal original

Aqui ya insertamos todas nuestras variables de salida para poder general nuestros valores:

peso.predict <- (pr.nn$net.result*(max(datos$Peso1)-min(datos$Peso1))+min(datos$Peso1))+
((max(datos$Peso2)-min(datos$Peso2))+min(datos$Peso2))+
((max(datos$Peso3)-min(datos$Peso3))+min(datos$Peso3))+
((max(datos$Peso4)-min(datos$Peso4))+min(datos$Peso4))+
((max(datos$Peso5)-min(datos$Peso5))+min(datos$Peso5))+
((max(datos$Peso6)-min(datos$Peso6))+min(datos$Peso6))
peso.predict
peso.real <- ((test_nrm$Peso1)*(max(datos$Peso1)-min(datos$Peso1))+min(datos$Peso1))+
((max(datos$Peso2)-min(datos$Peso2))+min(datos$Peso2))+
((max(datos$Peso3)-min(datos$Peso3))+min(datos$Peso3))+
((max(datos$Peso4)-min(datos$Peso4))+min(datos$Peso4))+
((max(datos$Peso5)-min(datos$Peso5))+min(datos$Peso5))+
((max(datos$Peso6)-min(datos$Peso6))+min(datos$Peso6))
#Generamos:
peso.real

Hallamos la suma de error cuadrático:

-----------------------------------------------------

se.nn <- sum((peso.real- peso.predict)^2)/nrow(test_nrm)
se.nn

#Generamos nuestra red neuronal:

-----------------------------------------------

Graficamos:

qqplot(x=peso.real, y=peso.predict, geom=c("point","smoth"), method="lm",
main=paste(" Real Vs Prediccion\nSuma de Error Cuadratico=",round(se.nn,2)))

Red

plot(modelo.nn)

Agradeceria su apoyo porfavor

DATOS:
Encabezados: Parto, Sexo, Pesoi, Peso1, Peso2, Peso3, Peso4, Peso5, Peso6
_____________1____1___3.70___5.00___6.15___7.45__8.25__9.10__10.65
_____________1____1___3.15___4.75___5.80___6.45__7.30__8.40___9.10
_____________1____2___3.55___4.70___5.90___6.70__8.15__9.55___11.15

El trabajo es sobre construir una RNA con 3 variables de entrada (Parto, Sexo, Pesoi) y 6 variables de salida (Peso1.Peso2,Peso3,Peso4,Peso5,Peso6)

Hi @Paco1234 , remember put the question in English language for make more open for all community.

In other way, is important put a reproducible example. You put the code, is well. But the data don´t not.

1 Like

Hola, acabo de subir los datos espero puedas ayudarme gracias

Hola, por favor lee la guía para elaborar un ejemplo mínimo reproducible (ReprEx, por sus siglas en inglés), la forma en la que has compartido tus datos no es la más adecuada, hace que sea difícil utilizarlos para probar tu código.

En caso de que sea más fácil para ti, también hay una versión en español que puedes encontrar en este link:

Nota: Usar otros idiomas no va en contra de las políticas del foro, pero por favor intenta hacer tus preguntas en inglés, ya que es el idioma preferido aquí y al usar español estás excluyendo a la mayoría de la conversación, reduciendo así tus posibilidades de obtener ayuda.

Update the data to the format that was requested, you can review it please

Actualice los datos al formato que me pidieron, puedes revisarlo porfavor

Your reprex fails to create modelo.nn it fails with the error

> modelo.nn <- neuralnet(frml,
+                        data          = train_nrm,
+                        hidden        = c(4),
+                        threshold     = 0.01,
+                        algorithm     = "rprop+",
+                        learningrate = 0.005)
Error: the error derivative contains a NA; varify that the derivative function does not divide by 0 (e.g. cross entropy)

I would think that Parto is not handled correctly. perhaps you need to modify your example to contain examples with Parto not being only ever '1'

now you create the model?, that data can be changed. I need to correct the error that appears in pr.nn

It wasn't clear from your comment post, but it seems you have updated your data as I requested, and now modelo.nn is produced, so thats a good step.

for the end , how about something like

pr.nn   <- predict(modelo.nn, newdata=test_nrm)

I must say, I dont understand what your intent is with this model, the formula fmrl doest make much sense to me. what are you trying to predict from what ? trying to predict all the peso columns from parto sexo and all the peso columns ? seems wrong

I try to predict the variables Peso1, Peso2, Peso3, Peso4, Peso5, Peso6. Starting from the variables Parto, Sexo y Pesoi

You will not have email or whatsapp to communicate more easily?

it couldnt be easier than this.

anyway, I have solved your issue.
you should change your frml

frml <- as.formula(paste("Peso1+Peso2+Peso3+Peso4+Peso5+Peso6 ~",
                         paste(nms[!nms %in% c("Peso1",
                                               "Peso2",
                                               "Peso3",
                                               "Peso4",
                                               "Peso5",
                                               "Peso6")],collapse = " + ")))
# MODELO
modelo.nn <- neuralnet(frml,
                       data          = train_nrm,
                       hidden        = c(4),
                       threshold     = 0.01,
                       algorithm     = "rprop+",
                       learningrate = 0.005,)
#Generamos: 
modelo.nn

(pr.nn   <- predict(modelo.nn, newdata=test_nrm))

if the error solves it but now it generates another one in peso.predict, I already uploaded all the code so that you can review it please

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.