Existen también modelos estadísticos para evaluar el efecto de predictores, o variables independientes, sobre variables dependientes o respuesta que son factoriales. Vamos a ver en esta sección, cómo:
El ejemplo que vamos a utilizar son los datos de Iris. Lo que queremos es ver si las características de sus pétalos y sépalos pueden explicar o servir para predecir a qué especie pertenecen, es decir, si sirven como factores para clasificar cada muestra en su especie correspondiente.
Necesitamos instalar el paquete nnet para ejecutar la función multinom()
:
install.packages("nnet")
library(nnet)
data(iris, package="datasets")
La sintaxis es la de siempre, a través de una fórmula. Los modelos multinomiales, en cualquier caso, reportarñan algunos datos de las iteraciones que realizan mientras se ajustan los datos.
MLM.1 <- multinom(Species ~ Petal.Length + Petal.Width + Sepal.Length +
Sepal.Width, data=iris)
## # weights: 18 (10 variable)
## initial value 164.791843
## iter 10 value 16.177348
## iter 20 value 7.111438
## iter 30 value 6.182999
## iter 40 value 5.984028
## iter 50 value 5.961278
## iter 60 value 5.954900
## iter 70 value 5.951851
## iter 80 value 5.950343
## iter 90 value 5.949904
## iter 100 value 5.949867
## final value 5.949867
## stopped after 100 iterations
summary(MLM.1)
## Call:
## multinom(formula = Species ~ Petal.Length + Petal.Width + Sepal.Length +
## Sepal.Width, data = iris)
##
## Coefficients:
## (Intercept) Petal.Length Petal.Width Sepal.Length Sepal.Width
## versicolor 18.69037 14.24477 -3.097684 -5.458424 -8.707401
## virginica -23.83628 23.65978 15.135301 -7.923634 -15.370769
##
## Std. Errors:
## (Intercept) Petal.Length Petal.Width Sepal.Length Sepal.Width
## versicolor 34.97116 60.19170 45.48852 89.89215 157.0415
## virginica 35.76649 60.46753 45.93406 89.91153 157.1196
##
## Residual Deviance: 11.89973
## AIC: 31.89973
Vamos a aprovechar el ejercicio para introducir el uso de los modelos para predecir, ya que de eso se trata en este caso, La función predict()
se puede usar con cualquier modelo para sacar un vector de datos con las predicciones de cada fila, de acuerdo a los valores de los predictores utilizados.
predict(MLM.1)
## [1] setosa setosa setosa setosa setosa setosa
## [7] setosa setosa setosa setosa setosa setosa
## [13] setosa setosa setosa setosa setosa setosa
## [19] setosa setosa setosa setosa setosa setosa
## [25] setosa setosa setosa setosa setosa setosa
## [31] setosa setosa setosa setosa setosa setosa
## [37] setosa setosa setosa setosa setosa setosa
## [43] setosa setosa setosa setosa setosa setosa
## [49] setosa setosa versicolor versicolor versicolor versicolor
## [55] versicolor versicolor versicolor versicolor versicolor versicolor
## [61] versicolor versicolor versicolor versicolor versicolor versicolor
## [67] versicolor versicolor versicolor versicolor versicolor versicolor
## [73] versicolor versicolor versicolor versicolor versicolor versicolor
## [79] versicolor versicolor versicolor versicolor versicolor virginica
## [85] versicolor versicolor versicolor versicolor versicolor versicolor
## [91] versicolor versicolor versicolor versicolor versicolor versicolor
## [97] versicolor versicolor versicolor versicolor virginica virginica
## [103] virginica virginica virginica virginica virginica virginica
## [109] virginica virginica virginica virginica virginica virginica
## [115] virginica virginica virginica virginica virginica virginica
## [121] virginica virginica virginica virginica virginica virginica
## [127] virginica virginica virginica virginica virginica virginica
## [133] virginica versicolor virginica virginica virginica virginica
## [139] virginica virginica virginica virginica virginica virginica
## [145] virginica virginica virginica virginica virginica virginica
## Levels: setosa versicolor virginica
Por tanto vamos a sacar a continuación una tabla que contenga la especie a la que pertenece cada uno de nuestros casos por una parte y lo que se ha predicho, para evaluar si los casos son correctos, o no.
mi_prediccion<-cbind(iris,predict(MLM.1))
Si sacamos por pantalla todos los datos podríamos ver que casi todas están correctamente predichas. Hay algún caso donde la predicción está equivocada, como en el caso de la fila 134:
mi_prediccion[134,]
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 134 6.3 2.8 5.1 1.5 virginica
## predict(MLM.1)
## 134 versicolor
Ver caso por caso para evaluar la calidad del modelo es difícil de esta manera, sin embargo. Por ello, vamos a realizar una tabla de contingencia para ver cuántos casos no han sido correctamente asignados o predichos:
table(mi_prediccion[,5],mi_prediccion[,6])
##
## setosa versicolor virginica
## setosa 50 0 0
## versicolor 0 49 1
## virginica 0 1 49
Todos los datos están correctamente predichos, salvo una confusión entre Iris setosa e Iris virginica.