a) Planteamiento revisado de la pregunta predictiva

La exploración de las diferencias entre las estructuras de las flores de tres especies del género Iris, y el posterior análisis confirmatorio a través de pruebas de hipótesis (análisis de varianza y contrastes post hoc), pusieron en evidencia que la distribución de las dimensiones de la especie setosa se colocaba, en todos los casos, lejos de las respectivas distribuciones de sus hermanas de género (versicolor y virginica), a través de una brecha importante que permite inferir una clara diferenciación, sobre todo de los pétalos, entre las tres especies.

En efecto, discriminar a los especímenes de I. setosa por el tamaño de sus pétalos constituye una tarea bastante segura, lo cual libera al analista de mayor procedimiento, pues no hay traslape alguno en los valores de estas dimensiones (longitud y anchura), con una brecha ante su pariente más cercana de varios milímetros (entre dos y siete mm, en términos generales).

Sin embargo, también se hizo evidente el traslape de las distribuciones de las otras dos especies (I. versicolor e I. virginica), por lo que la pregunta predictiva se plantea de la manera siguiente: ¿es posible predecir de manera razonable la especie de una planta del género Iris (ya sea I. versicolor o I. virginica) a partir de las dimensiones de sus flores?

b) Dataset y variables seleccionadas

Carga de datos y paquetes pertinentes

library(ggplot2)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(caret)
## Cargando paquete requerido: lattice
iris_aae <- read.csv("iris_aae.csv", header = TRUE, row.names = "id")
head(iris_aae)
##   sepal_length sepal_width petal_length petal_width variety area.sepalo
## 1          5.1         3.5          1.4         0.2  Setosa       17.85
## 2          4.9         3.0          1.4         0.2  Setosa       14.70
## 3          4.7         3.2          1.3         0.2  Setosa       15.04
## 4          4.6         3.1          1.5         0.2  Setosa       14.26
## 5          5.0         3.6          1.4         0.2  Setosa       18.00
## 6          5.4         3.9          1.7         0.4  Setosa       21.06
##   area.petalo
## 1        0.28
## 2        0.28
## 3        0.26
## 4        0.30
## 5        0.28
## 6        0.68

Exploración de varios modelos

Creación de una variable dicotómica para separar a I. setosa

iris_aae <- iris_aae %>%
  mutate(setosa_vs_not = ifelse(variety == "Setosa", 1, 0))
head(iris_aae)
##   sepal_length sepal_width petal_length petal_width variety area.sepalo
## 1          5.1         3.5          1.4         0.2  Setosa       17.85
## 2          4.9         3.0          1.4         0.2  Setosa       14.70
## 3          4.7         3.2          1.3         0.2  Setosa       15.04
## 4          4.6         3.1          1.5         0.2  Setosa       14.26
## 5          5.0         3.6          1.4         0.2  Setosa       18.00
## 6          5.4         3.9          1.7         0.4  Setosa       21.06
##   area.petalo setosa_vs_not
## 1        0.28             1
## 2        0.28             1
## 3        0.26             1
## 4        0.30             1
## 5        0.28             1
## 6        0.68             1
tail(iris_aae)
##     sepal_length sepal_width petal_length petal_width   variety area.sepalo
## 145          6.7         3.3          5.7         2.5 Virginica       22.11
## 146          6.7         3.0          5.2         2.3 Virginica       20.10
## 147          6.3         2.5          5.0         1.9 Virginica       15.75
## 148          6.5         3.0          5.2         2.0 Virginica       19.50
## 149          6.2         3.4          5.4         2.3 Virginica       21.08
## 150          5.9         3.0          5.1         1.8 Virginica       17.70
##     area.petalo setosa_vs_not
## 145       14.25             0
## 146       11.96             0
## 147        9.50             0
## 148       10.40             0
## 149       12.42             0
## 150        9.18             0

Ajustar modelo de regresión logística

Todas las variables predictoras

modelo_log_setosaVsNot.Todas <- glm(setosa_vs_not ~ petal_length + petal_width +
                                  sepal_length + sepal_width,
                                  data = iris_aae, family = binomial)
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary.glm(modelo_log_setosaVsNot.Todas)
## 
## Call:
## glm(formula = setosa_vs_not ~ petal_length + petal_width + sepal_length + 
##     sepal_width, family = binomial, data = iris_aae)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)
## (Intercept)     -16.946 457457.096       0        1
## petal_length    -20.088 107724.592       0        1
## petal_width     -21.608 154350.613       0        1
## sepal_length     11.759 130504.039       0        1
## sepal_width       7.842  59415.383       0        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1.9095e+02  on 149  degrees of freedom
## Residual deviance: 3.2940e-09  on 145  degrees of freedom
## AIC: 10
## 
## Number of Fisher Scoring iterations: 25

Sólo las variables que en el análisis exploratorio se diferencian

modelo_log_setosaVsNot.SoloDiferentes <- glm(setosa_vs_not ~ petal_length +
                                            petal_width, data = iris_aae,
                                            family = binomial)
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary.glm(modelo_log_setosaVsNot.SoloDiferentes)
## 
## Call:
## glm(formula = setosa_vs_not ~ petal_length + petal_width, family = binomial, 
##     data = iris_aae)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)
## (Intercept)      69.45   43042.94   0.002    0.999
## petal_length    -17.60   43449.07   0.000    1.000
## petal_width     -33.89  115850.84   0.000    1.000
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1.9095e+02  on 149  degrees of freedom
## Residual deviance: 5.1700e-09  on 147  degrees of freedom
## AIC: 6
## 
## Number of Fisher Scoring iterations: 25

Comentario: en ambos modelos, tanto con las cuatro variables disponibles como con las seleccionadas por su poder de discriminación, se lanza una advertencia de que las probabilidades de acertar son perfectas. En realidad, el procedimiento no hace más que la exploración previa: constatar que la distribución de I. setosa no se traslapa con las de sus parientes de género, y que, inclusive, hay una brecha que permite al taxónomo separar con las solas medidas del pétalo a los ejemplares.

Optaremos ahora por trabajar con la especie de mayor tamaño (I. virginica), cuyas distribuciones se traslapan, en efecto, con las de I. versicolor. Sin embargo, conservaremos en el esquema analítico los datos de la especie pequeña I. setosa, con fines de control y de apreciación del efecto de su presencia comparativa.

Creación de variable dummy con respecto a la variedad virginica

iris_aae <- iris_aae %>%
  mutate(virgi_vs_not = ifelse(variety == "Virginica", 1, 0))
head(iris_aae)
##   sepal_length sepal_width petal_length petal_width variety area.sepalo
## 1          5.1         3.5          1.4         0.2  Setosa       17.85
## 2          4.9         3.0          1.4         0.2  Setosa       14.70
## 3          4.7         3.2          1.3         0.2  Setosa       15.04
## 4          4.6         3.1          1.5         0.2  Setosa       14.26
## 5          5.0         3.6          1.4         0.2  Setosa       18.00
## 6          5.4         3.9          1.7         0.4  Setosa       21.06
##   area.petalo setosa_vs_not virgi_vs_not
## 1        0.28             1            0
## 2        0.28             1            0
## 3        0.26             1            0
## 4        0.30             1            0
## 5        0.28             1            0
## 6        0.68             1            0
tail(iris_aae)
##     sepal_length sepal_width petal_length petal_width   variety area.sepalo
## 145          6.7         3.3          5.7         2.5 Virginica       22.11
## 146          6.7         3.0          5.2         2.3 Virginica       20.10
## 147          6.3         2.5          5.0         1.9 Virginica       15.75
## 148          6.5         3.0          5.2         2.0 Virginica       19.50
## 149          6.2         3.4          5.4         2.3 Virginica       21.08
## 150          5.9         3.0          5.1         1.8 Virginica       17.70
##     area.petalo setosa_vs_not virgi_vs_not
## 145       14.25             0            1
## 146       11.96             0            1
## 147        9.50             0            1
## 148       10.40             0            1
## 149       12.42             0            1
## 150        9.18             0            1

Todas las variables predictoras para I. virginica

modelo_log_virgiVsNot.Todas <- glm(virgi_vs_not ~ petal_length + petal_width +
                                      sepal_length + sepal_width,
                                    data = iris_aae, family = binomial)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary.glm(modelo_log_virgiVsNot.Todas) # resumen del modelo
## 
## Call:
## glm(formula = virgi_vs_not ~ petal_length + petal_width + sepal_length + 
##     sepal_width, family = binomial, data = iris_aae)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)  
## (Intercept)   -42.638     25.708  -1.659   0.0972 .
## petal_length    9.429      4.737   1.990   0.0465 *
## petal_width    18.286      9.743   1.877   0.0605 .
## sepal_length   -2.465      2.394  -1.030   0.3032  
## sepal_width    -6.681      4.480  -1.491   0.1359  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 190.954  on 149  degrees of freedom
## Residual deviance:  11.899  on 145  degrees of freedom
## AIC: 21.899
## 
## Number of Fisher Scoring iterations: 12

Comentario: Como se constata en el modelo resumido, los coeficientes asociados con las dimensiones de los sépalos no son diferentes de cero, pero sí lo de las dimensiones de los pétalos, por lo que procedemos a modelar con base en las solas variables del pétalo.

Sólo las variables significativas para I. virginica

modelo_log_virgiVsNot.SoloDiferentes <- glm(virgi_vs_not ~ petal_length + petal_width,
                                             data = iris_aae, family = binomial)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary.glm(modelo_log_virgiVsNot.SoloDiferentes) # resumen del modelo
## 
## Call:
## glm(formula = virgi_vs_not ~ petal_length + petal_width, family = binomial, 
##     data = iris_aae)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -45.272     13.611  -3.326 0.000881 ***
## petal_length    5.755      2.306   2.496 0.012575 *  
## petal_width    10.447      3.756   2.782 0.005409 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 190.954  on 149  degrees of freedom
## Residual deviance:  20.564  on 147  degrees of freedom
## AIC: 26.564
## 
## Number of Fisher Scoring iterations: 10

Comentario: en ausencia de las variables con coeficientes de cero, las variables restantes, las del pétalo, separan con claridad a los ejemplares de la I. virginica; inclusive, con cierta sorpresa se tiene que la anchura del pétalo lo hace con mayor fuerza que la longitud.

Predicciones

predicciones <- ifelse(predict(modelo_log_virgiVsNot.SoloDiferentes,
                               type = "response") > 0.5, 1, 0)

Matriz de confusión

library(caret)
confusionMatrix(as.factor(predicciones), as.factor(iris_aae$virgi_vs_not))
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 97  3
##          1  3 47
##                                          
##                Accuracy : 0.96           
##                  95% CI : (0.915, 0.9852)
##     No Information Rate : 0.6667         
##     P-Value [Acc > NIR] : <2e-16         
##                                          
##                   Kappa : 0.91           
##                                          
##  Mcnemar's Test P-Value : 1              
##                                          
##             Sensitivity : 0.9700         
##             Specificity : 0.9400         
##          Pos Pred Value : 0.9700         
##          Neg Pred Value : 0.9400         
##              Prevalence : 0.6667         
##          Detection Rate : 0.6467         
##    Detection Prevalence : 0.6667         
##       Balanced Accuracy : 0.9550         
##                                          
##        'Positive' Class : 0              
## 

c) Visualizaciones clave

Tamaño del sépalo

ggplot(iris_aae, aes(x = sepal_length, y = sepal_width,
                     color = variety, shape = variety)) +
  geom_point() + 
  scale_color_manual(values = c("orange", "limegreen", "darkred")) +
  labs(title = "Tamaño del sépalo en el género Iris",
       x = "Longitud del sépalo (cm)", y = "Anchura del sépalo (cm)") +
  theme(legend.position = c(.65, .85))

Tamaño del pétalo

ggplot(iris_aae, aes(x = petal_length, y = petal_width, color = variety,
                     shape = variety)) +
  geom_point() +
  scale_color_manual(values = c("orange", "limegreen", "darkred")) +
  labs(title = "Tamaño del pétalo en el género Iris",
       x = "Longitud del pétalo (cm)", y = "Anchura del pétalo (cm)") +
  theme(legend.position = c(.9, .2))

Tamaño del sépalo vs. tamaño del pétalo

ggplot(iris_aae, aes(x = petal_length, fill = variety)) +
  geom_density(alpha = 0.3) +
  labs(title = "Pétalos del género Iris", subtitle = "Longitud del pétalo (cm)",
       y = "Densidad", x = "") +
  theme(legend.position = c(.9, .8)) # longitud pétalo

ggplot(iris_aae, aes(x = petal_width, fill = variety)) +
  geom_density(alpha = 0.3) +
  labs(title = "Pétalos del género Iris", subtitle = "Anchura del pétalo (cm)",
       y = "Densidad", x = "") +
  theme(legend.position = c(.9, .8)) # anchura pétalo

ggplot(iris_aae, aes(x = sepal_length, fill = variety)) +
  geom_density(alpha = 0.3) +
  labs(title = "Sépalos del género Iris", subtitle = "Longitud del sépalo (cm)",
       y = "Densidad", x = "") +
  theme(legend.position = c(.9, .8)) # longitud del sépalo

ggplot(iris_aae, aes(x = sepal_width, fill = variety)) +
  geom_density(alpha = 0.3) +
  labs(title = "Sépalos del género Iris", subtitle = "Anchura del sépalo (cm)",
       y = "Densidad", x = "") +
  theme(legend.position = c(.9, .8)) # anchura del sépalo

d) Modelo final

Fórmula

\(I. virginica = -45.27 + 5.75(LongPetalo) + 10.4(AnchPetalo)\)

Interpretación de coeficientes

Como ambos coeficientes relacionados con las variables son positivos, tanto la longitud como la anchura aumentan las probabilidades de que la planta pertenezca a la especie I. virginica cuando sus valores son muy altos.

Significancia

Ambos coeficientes son significativos a más de 95 %. Sin embargo, la anchura del pétalo es más del doble de potente que la longitud del pétalo para separar a la especie I. virginica de las otras.

Métricas globales

La sensibilidad del modelo es de 97 % – sólo aparecen tres plantas de 100 predichas como virginica pero que, en realidad, no lo son.

La especificidad alcanza 94 % – sólo tres plantas que, siendo efectivamente virginica, no las reconoce como tales.

La exactitud se eleva a 0.96 – sólo seis de 150 casos se clasificaron erróneamente (intervalo de confianza a 95 %: 0.915, 0.985)

e) Discusión del modelo:

Basado en las dimensiones de los pétalos, el modelo predice la probabilidad de que un planta provenga de la especie Iris virginica. Las medidas de los sépalos aportan poca información para hacer esta distinción.

Atendiendo a las probabilidades asociadas con la distribución de cada variable, y asociándolas con las de dos o más variables, se establece una regla de predicción probabilística.

Limitaciones: cuando las distribuciones de las variables no están superpuestas, el modelo logit no hace nada en realidad, por lo que se hace necesario realizar un análisis exploratorio exhaustivo que permita al analista vislumbrar las variables pertinentes para la clasificación.

Fortalezas: si las variables se eligen bien, con bases teóricas sólidas y un muestreo cuidadoso, el modelo de predicción logit puede proporcionar poderosas predicciones de una variable dicotómica basada en los valores de uno o varias variables cuantitativas o cualitativas.

f) Conclusiones

Referencias

Anderson, Edgar (1935). The irises of the Gaspe Peninsula, Bulletin of the American Iris Society, 59, 2-5.

Fisher, Ronald A. (1936). The use of multiple measurements in taxonomic problems. Annals of Eugenics, 7, Part II, 179-188. doi:10.1111/j.1469-1809.1936.tb02137.x

Paquetes de R empleados

citation("dplyr")
## To cite package 'dplyr' in publications use:
## 
##   Wickham H, François R, Henry L, Müller K, Vaughan D (2023). _dplyr: A
##   Grammar of Data Manipulation_. doi:10.32614/CRAN.package.dplyr
##   <https://doi.org/10.32614/CRAN.package.dplyr>, R package version
##   1.1.4, <https://CRAN.R-project.org/package=dplyr>.
## 
## A BibTeX entry for LaTeX users is
## 
##   @Manual{,
##     title = {dplyr: A Grammar of Data Manipulation},
##     author = {Hadley Wickham and Romain François and Lionel Henry and Kirill Müller and Davis Vaughan},
##     year = {2023},
##     note = {R package version 1.1.4},
##     url = {https://CRAN.R-project.org/package=dplyr},
##     doi = {10.32614/CRAN.package.dplyr},
##   }
citation("ggplot2")
## To cite ggplot2 in publications, please use
## 
##   H. Wickham. ggplot2: Elegant Graphics for Data Analysis.
##   Springer-Verlag New York, 2016.
## 
## A BibTeX entry for LaTeX users is
## 
##   @Book{,
##     author = {Hadley Wickham},
##     title = {ggplot2: Elegant Graphics for Data Analysis},
##     publisher = {Springer-Verlag New York},
##     year = {2016},
##     isbn = {978-3-319-24277-4},
##     url = {https://ggplot2.tidyverse.org},
##   }
citation("caret")
## To cite caret in publications use:
## 
##   Kuhn, M. (2008). Building Predictive Models in R Using the caret
##   Package. Journal of Statistical Software, 28(5), 1–26.
##   https://doi.org/10.18637/jss.v028.i05
## 
## A BibTeX entry for LaTeX users is
## 
##   @Article{,
##     title = {Building Predictive Models in R Using the caret Package},
##     volume = {28},
##     url = {https://www.jstatsoft.org/index.php/jss/article/view/v028i05},
##     doi = {10.18637/jss.v028.i05},
##     number = {5},
##     journal = {Journal of Statistical Software},
##     author = {{Kuhn} and {Max}},
##     year = {2008},
##     pages = {1–26},
##   }