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.