#1.- INTRODUCCIÓN
El Análisis Discriminante Lineal o Linear Discrimiant Analysis (LDA) es un método de clasificación supervisado de variables cualitativas en el que dos o más grupos son conocidos a priori y nuevas observaciones se clasifican en uno de ellos en función de sus características. Haciendo uso del teorema de Bayes, LDA estima la probabilidad de que una observación, dado un determinado valor de los predictores, pertenezca a cada una de las clases de la variable cualitativa, P(Y=k|X=x). Finalmente se asigna la observación a la clase k para la que la probabilidad predicha es mayor. Es una alternativa a la regresión logística cuando la variable cualitativa tiene más de dos niveles. Si bien existen extensiones de la regresión logística para múltiples clases, el LDA presenta una serie de ventajas:
Si las clases están bien separadas, los parámetros estimados en el modelo de regresión logística son inestables. El método de LDA no sufre este problema. Si el número de observaciones es bajo y la distribución de los predictores es aproximadamente normal en cada una de las clases, LDA es más estable que la regresión logística. Cuando se trata de un problema de clasificación con solo dos niveles, ambos métodos suelen llegar a resultados similares.
El proceso de un análisis discriminante puede resumirse en 6 pasos:
Disponer de un conjunto de datos de entrenamiento (training data) en el que se conoce a que grupo pertenece cada observación. Calcular las probabilidades previas (prior probabilities): la proporción esperada de observaciones que pertenecen a cada grupo. Determinar si la varianza o matriz de covarianzas es homogénea en todos los grupos. De esto dependerá que se emplee LDA o QDA. Estimar los parámetros necesarios para las funciones de probabilidad condicional, verificando que se cumplen las condiciones para hacerlo. Calcular el resultado de la función discriminante. El resultado de esta determina a qué grupo se asigna cada observación. Utilizar validación cruzada (cross-validation) para estimar las probabilidades de clasificaciones erróneas.
#2.- EJEMPLO
library(ggplot2)
ggplot(data.frame(x = c(-6, 10)), aes(x)) +
stat_function(fun = dnorm, args = list(mean = -1.25, sd = 1.5),
color = "red") +
stat_function(fun = dnorm, args = list(mean = 1.25, sd = 1.5), color = "blue") +
geom_vline(xintercept = 0, linetype = "longdash") +
theme_bw()
set.seed(6911)
library(ggplot2)
grupo_a <- rnorm(n = 300, mean = -1.25, sd = 1.5)
grupo_b <- rnorm(n = 300, mean = 1.25, sd = 1.5)
datos <- data.frame(valor =c(grupo_a, grupo_b),
grupo = rep(c("A", "B"), each = 300))
ggplot(data = datos, aes(x = valor, fill = grupo)) +
geom_histogram(alpha = 0.5, position = "identity") +
geom_vline(xintercept = 0, linetype = "longdash") +
geom_vline(xintercept = (mean(grupo_a) + mean(grupo_b))/2) +
annotate(geom = "text", x = 1.5, y = 9, label = "Límite decisión LDA") +
annotate(geom = "text", x = -1.5, y = 10, label = "Límite decisión Bayes") +
theme_bw() + theme(legend.position = "top")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
mu1 <- 0 # set mean x1
mu2 <- 0 # set mean x2
s11 <- 10 # set variance x1
s22 <- 10 # set variance x2
s12 <- 15 # set covariance x1 and x2
rho <- 0.5 # set correlation coefficient x1 and x2
x1 <- seq(-10,10,length = 41) # generate vector x1
x2 <- x1 # copy x1 to x2
f <- function(x1,x2) # multivariate function
{
term1 <- 1/(2 * pi * sqrt(s11*s22*(1 - rho^2)))
term2 <- -1/(2 * (1 - rho^2))
term3 <- (x1 - mu1)^2/s11
term4 <- (x2 - mu2)^2/s22
term5 <- -2*rho*((x1 - mu1)*(x2 - mu2))/(sqrt(s11)*sqrt(s22))
term1*exp(term2*(term3 + term4 - term5))
}
z <- outer(x1,x2,f) # calculate density values
persp(x1, x2, z, # 3-D plot
main = "Distribución multivariante con dos predictores",
col = "lightgreen",
theta = 30, phi = 20,
r = 50,
d = 0.1,
expand = 0.5,
ltheta = 90, lphi = 180,
shade = 0.75,
ticktype = "simple",
nticks = 5)
# Otra forma de representar una distribución bivariante
library(mvtnorm)
library(scatterplot3d)
sigma.zero <- matrix(c(1,0,0,1), ncol = 2)
x1000 <- rmvnorm(n = 1000, mean = c(0,0), sigma = sigma.zero)
scatterplot3d(x1000[,1], x1000[,2],
dmvnorm(x1000, mean = c(0,0), sigma = sigma.zero),
highlight = TRUE, xlab = "x", ylab = "y", zlab = "z")
Esto es importante para un análisis discriminante lineal para que se
pueda aplicar correctamente.
Condiciones de LDA
Las condiciones que se deben cumplir para que un Análisis Discriminante Lineal sea válido son:
Cada predictor que forma parte del modelo se distribuye de forma normal en cada una de las clases de la variable respuesta. En el caso de múltiples predictores, las observaciones siguen una distribución normal multivariante en todas las clases.
La varianza del predictor es igual en todas las clases de la variable respuesta. En el caso de múltiples predictores, la matriz de covarianza es igual en todas las clases. Si esto no se cumple se recurre a Análisis Discriminante Cuadrático (QDA).
Cuando la condición de normalidad no se cumple, el LDA pierde precisión pero aun así puede llegar a clasificaciones relativamente buenas. Using discriminant analysis for multi-class classification: an experimental investigation (Tao Li, Shenghuo Zhu, Mitsunori Ogihara).
Dos aproximaciones a LDA: Bayes y Fisher
Existen varios enfoques posibles para realizar un LDA. La aproximación descrita anteriormente está basada en el clasificador de Bayes, y utiliza todas las variables originales para calcular las probabilidades posteriores de que una observación pertenezca a cada grupo. La aproximación de Fisher se puede ver como un proceso con dos partes:
Reducción de dimensionalidad: Se pasa de p variables predictoras originales a k combinaciones lineales de dichos predictores (variables discriminantes) que permiten explicar la separación de los grupos pero con menos dimensiones (k < p).
Clasificación de las observaciones empleando las variables discriminantes.
Los resultados de clasificación obtenidos mediante el método de Fisher son iguales a los obtenidos por el método de Bayes cuando:
En el método de Bayes se asume que la matriz de covarianzas en igual en todos los grupos y se emplea como estimación la pooled within-class covariance matrix.
En el método de Fisher, todos los discriminantes lineales se utilizan para la clasificación. El número máximo de discriminantes obtenido tras la reducción de dimensionalidad es número grupos-1.
Precisión del LDA
Una vez que las normas de clasificación se han establecido, se tiene que evaluar como de buena es la clasificación resultante. En otras palabras, evaluar el porcentaje de aciertos en las clasificaciones.
Las matrices de confusión son una de las mejores formas de evaluar la capacidad de acierto que tiene un modelo LDA. Muestran el número de verdaderos positivos, verdaderos negativos, falsos positivos y falsos negativos. El método LDA busca los límites de decisión que más se aproximan al clasificador de Bayes, que por definición, tiene el menor ratio de error total de entre todos los clasificadores (si se cumple la condición de normalidad). Por lo tanto, el LDA intenta conseguir el menor número de clasificaciones erróneas posibles, pero no diferencia entre falsos positivos o falsos negativos. Si se quiere intentar reducir el número de errores de clasificación en una dirección determinada (por ejemplo, menos falsos negativos) se puede modificar el límite de decisión, aunque como consecuencia aumentará el número de falsos positivos.
Cuando para evaluar el error de clasificación se emplean las mismas observaciones con las que se ha creado el modelo, se obtiene lo que se denomina el training error. Si bien esta es una forma sencilla de estimar la precisión en la clasificación, tiende a ser excesivamente optimista. Es más adecuado evaluar el modelo empleando observaciones nuevas que el modelo no ha visto, obteniendo así el test error. En el capítulo Validación de modelos de regresión se describen diferentes estrategias para estimar el test error.
#3.- EJERCICIO DISCRIMINANTE 1
Un equipo de biólogos quiere generar un modelo estadístico que permita identificar a que especie (a o b) pertenece un determinado insecto. Para ello se han medido tres variables (longitud de las patas, diámetro del abdomen y diámetro del órgano sexual) en 10 individuos de cada una de las dos especies.
input <- ("
especie pata abdomen organo_sexual
a 191 131 53
a 185 134 50
a 200 137 52
a 173 127 50
a 171 128 49
a 160 118 47
a 188 134 54
a 186 129 51
a 174 131 52
a 163 115 47
b 186 107 49
b 211 122 49
b 201 144 47
b 242 131 54
b 184 108 43
b 211 118 51
b 217 122 49
b 223 127 51
b 208 125 50
b 199 124 46
")
datos <- read.table(textConnection(input), header = TRUE)
datos$especie <- as.factor(datos$especie)
Exploración de datos
library(ggplot2)
library(ggpubr)
p1 <- ggplot(data = datos, aes(x=pata, fill = especie))+
geom_histogram(position = "identity", alpha = 0.5)
p2 <- ggplot(data = datos, aes(x=abdomen, fill=especie)) +
geom_histogram(position = "identity", alpha = 0.5)
p3 <- ggplot(data = datos, aes(x=organo_sexual, fill=especie)) +
geom_histogram(position = "identity", alpha = 0.5)
ggarrange(p1, p2, p3, nrow = 3, common.legend = TRUE)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# correlaciones por separación
#---------------------------------
pairs(x=datos[,c("pata", "abdomen", "organo_sexual")],
col = c("red", "blue")[datos$especie], pch=19)
El par de variables abdomen-pata y el par pata-organo_sexual parecen
separar bien las dos especies.
library(scatterplot3d)
scatterplot3d(datos$pata, datos$abdomen, datos$organo_sexual,
color = c("red", "blue")[datos$especie], pch=19,
grid = TRUE, xlab = "pata", ylab = "abdomen", zlab = "organo sexual",
angle = 65, cex.axis = 0.6)
legend("topleft", bty = "n", cex = 0.8, title ="especie", c("a", "b"), fill= c("red", "blue"))
par(mfcol = c(2, 3))
for(k in 2:4) {
j0 <- names(datos)[k]
x0 <- seq(min(datos[, k]), max(datos[, k]), le = 50)
for (i in 1:2) {
i0 <- levels(datos$especie)[i]
x <- datos [datos$especie == i0, j0]
hist(x, proba = TRUE, col = "lightblue", main = paste ("especie", i0), xlab = j0)
lines(x0, dnorm(x0, mean(x), sd(x)), col = "red", lwd = 2)
}
}
par(mfcol = c(2,3))
for(k in 2:4) {
j0 <- names(datos)[k]
x0 <- seq(min(datos[, k]), max(datos[, k]), le = 50)
for (i in 1:2) {
i0 <- levels(datos$especie)[i]
x <- datos [datos$especie == i0, j0]
qqnorm(x, main = paste("especie", i0, j0), pch =19, col = i + 1)
qqline(x)
}
}
library(reshape2)
library(knitr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
datos_tidy <- melt(datos, value.name = "valor")
## Using especie as id variables
datos_tidy
## especie variable valor
## 1 a pata 191
## 2 a pata 185
## 3 a pata 200
## 4 a pata 173
## 5 a pata 171
## 6 a pata 160
## 7 a pata 188
## 8 a pata 186
## 9 a pata 174
## 10 a pata 163
## 11 b pata 186
## 12 b pata 211
## 13 b pata 201
## 14 b pata 242
## 15 b pata 184
## 16 b pata 211
## 17 b pata 217
## 18 b pata 223
## 19 b pata 208
## 20 b pata 199
## 21 a abdomen 131
## 22 a abdomen 134
## 23 a abdomen 137
## 24 a abdomen 127
## 25 a abdomen 128
## 26 a abdomen 118
## 27 a abdomen 134
## 28 a abdomen 129
## 29 a abdomen 131
## 30 a abdomen 115
## 31 b abdomen 107
## 32 b abdomen 122
## 33 b abdomen 144
## 34 b abdomen 131
## 35 b abdomen 108
## 36 b abdomen 118
## 37 b abdomen 122
## 38 b abdomen 127
## 39 b abdomen 125
## 40 b abdomen 124
## 41 a organo_sexual 53
## 42 a organo_sexual 50
## 43 a organo_sexual 52
## 44 a organo_sexual 50
## 45 a organo_sexual 49
## 46 a organo_sexual 47
## 47 a organo_sexual 54
## 48 a organo_sexual 51
## 49 a organo_sexual 52
## 50 a organo_sexual 47
## 51 b organo_sexual 49
## 52 b organo_sexual 49
## 53 b organo_sexual 47
## 54 b organo_sexual 54
## 55 b organo_sexual 43
## 56 b organo_sexual 51
## 57 b organo_sexual 49
## 58 b organo_sexual 51
## 59 b organo_sexual 50
## 60 b organo_sexual 46
datos
## especie pata abdomen organo_sexual
## 1 a 191 131 53
## 2 a 185 134 50
## 3 a 200 137 52
## 4 a 173 127 50
## 5 a 171 128 49
## 6 a 160 118 47
## 7 a 188 134 54
## 8 a 186 129 51
## 9 a 174 131 52
## 10 a 163 115 47
## 11 b 186 107 49
## 12 b 211 122 49
## 13 b 201 144 47
## 14 b 242 131 54
## 15 b 184 108 43
## 16 b 211 118 51
## 17 b 217 122 49
## 18 b 223 127 51
## 19 b 208 125 50
## 20 b 199 124 46
kable(datos_tidy %>% group_by(especie, variable) %>% summarise(p_value_Shapiro.test = shapiro.test(valor)$p.value))
## `summarise()` has grouped output by 'especie'. You can override using the
## `.groups` argument.
| especie | variable | p_value_Shapiro.test |
|---|---|---|
| a | pata | 0.7763034 |
| a | abdomen | 0.1845349 |
| a | organo_sexual | 0.6430844 |
| b | pata | 0.7985711 |
| b | abdomen | 0.5538213 |
| b | organo_sexual | 0.8217855 |
No hay evidencias de falta de normalidad univariante en ninguna de las variables empleadas como predictores en ninguno de los grupos.
# OUTLIERS
#---------------------------------
library(MVN)
outlier <- mvn(data = datos[, -1], mvnTest = "hz", multivariateOutlierMethod = "quan")
# Test de ROYSTON para normalidad multivariante
#---------------------------------------------------
royston_test <- mvn(data = datos[, -1], mvnTest = "royston", multivariatePlot = "qq")
royston_test$multivariateNormality
## Test H p value MVN
## 1 Royston 0.4636176 0.9299447 YES
hz_test <- mvn(data = datos[, -1], mvnTest = "hz")
hz_test$multivariateNormality
## Test HZ p value MVN
## 1 Henze-Zirkler 0.7870498 0.07666139 YES
A pesar de los 5 outliers detectados, ninguno de los dos test encuentra evidencias significativas ( α = 0.05) de falta de normalidad multivariante.
M box
library(biotools)
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
## ---
## biotools version 4.2
H0: las matrices de varianzas y covarianzas son iguales en los grupos (SÍ DISC) H1: las matrices de varianzas y covarianzas son iguales en los grupos (NO DISC)
boxM(data=datos[,2:4], grouping = datos[,1])
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: datos[, 2:4]
## Chi-Sq (approx.) = 9.831, df = 6, p-value = 0.132
Al nivel de significación del 5% no se rechaza la hipótesis H0. Las matrices de varianzas y covarianzas son iguales en los grupos (SÍ DISC).
MODELO LDA
#Modelo LDA
#--------------
modelo <- lda(formula = especie ~pata + abdomen + organo_sexual, data = datos)
print(modelo)
## Call:
## lda(especie ~ pata + abdomen + organo_sexual, data = datos)
##
## Prior probabilities of groups:
## a b
## 0.5 0.5
##
## Group means:
## pata abdomen organo_sexual
## a 179.1 128.4 50.5
## b 208.2 122.8 48.9
##
## Coefficients of linear discriminants:
## LD1
## pata 0.13225339
## abdomen -0.07941509
## organo_sexual -0.52655608
nuevas_observaciones <- data.frame(pata = 194, abdomen = 124, organo_sexual = 49)
predict(object = modelo, newdata = nuevas_observaciones)
## $class
## [1] b
## Levels: a b
##
## $posterior
## a b
## 1 0.05823333 0.9417667
##
## $x
## LD1
## 1 0.5419421
El resultado muestra que, según la función discriminante, la probabilidad posterior de que el espécimen pertenezca a la especie b es del 94.2% frente al 5.8% de que pertenezca a la especie a.
Calidad de la clasificación
predicciones <- predict(object = modelo, newdata = datos[,-1], method = "predictive")
table(datos$especie, predicciones$class,
dnn = c("Clase real", "Clase predicha"))
## Clase predicha
## Clase real a b
## a 10 0
## b 0 10
fiabilidad = (10 + 10)/(10+0+0+10) *100
paste("Fiabilidad", fiabilidad, "%")
## [1] "Fiabilidad 100 %"
training_error <- mean(datos$especie != predicciones$class)*100
paste("training_error", training_error, "%")
## [1] "training_error 0 %"
with(datos, {
s3d <- scatterplot3d(pata, abdomen, organo_sexual,
color = c("red", "blue")[datos$especie],
pch = 19, grid = TRUE, xlab = "pata", ylab = "abdomen",
zlab = "organo sexual", angle = 65, cex.axis = 0.6)
s3d.coords <- s3d$xyz.convert(pata, abdomen, organo_sexual)
# convierte coordenadas 3D en proyecciones 2D
text(s3d.coords$x, s3d.coords$y, # cordenadas x, y
labels = datos$especie, # texto
cex = .8, pos = 4)
legend("topleft",
bty = "n", cex = 0.8,
title = "Especie",
c("a", "b"), fill = c("red", "blue"))
})
#4.- EJERCICIO DISCRIMINANTE 2
El set de datos Iris contiene métricas de 150 flores de 3 especies diferentes de planta Iris. Para cada flor se han registrado 4 variables: sepal length, sepal width, petal length y petal width, todas ellas en centímetros. Se desea generar un modelo discriminante que permita clasificar las flores en las distintas especies empleando las variables mencionadas.
data("iris")
kable(head(iris, n = 10))
| Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
|---|---|---|---|---|
| 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 4.9 | 3.0 | 1.4 | 0.2 | setosa |
| 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 5.0 | 3.6 | 1.4 | 0.2 | setosa |
| 5.4 | 3.9 | 1.7 | 0.4 | setosa |
| 4.6 | 3.4 | 1.4 | 0.3 | setosa |
| 5.0 | 3.4 | 1.5 | 0.2 | setosa |
| 4.4 | 2.9 | 1.4 | 0.2 | setosa |
| 4.9 | 3.1 | 1.5 | 0.1 | setosa |
library(ggplot2)
library(ggpubr)
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
plot1 <- ggplot(data = iris, aes(x=Sepal.Length , fill = Species)) +
geom_histogram(position = "identity", alpha = 0.5)
plot2 <- ggplot(data = iris, aes(x=Sepal.Width, fill = Species)) +
geom_histogram(position = "identity", alpha = 0.5)
plot3 <- ggplot(data = iris, aes(x=Petal.Length, fill = Species)) +
geom_histogram(position = "identity", alpha = 0.5)
plot4 <- ggplot(data = iris, aes(x=Petal.Width , fill = Species)) +
geom_histogram(position = "identity", alpha = 0.5)
ggarrange(plot1, plot2, plot3, plot4, nrow = 4, common.legend = TRUE)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
pairs(x = iris[, -5], col = c("green", "red", "blue")[iris$Species], pch = 19)
Las variables Petal.Length y Petal.Width son las dos variables con más
potencial para poder separar entre clases. Sin embargo, están altamente
correlacionadas, por lo que la información que aportan es en gran medida
redundante.
par(mfcol = c(3, 4))
for (k in 1:4){
j0 <- names(iris)[k]
x0 <- seq(min(iris[k]), max(iris[k]), le = 50)
for (i in 1:3){
i0 <- levels(iris$Species)[i]
x <- iris[iris$Species == i0, j0]
qqnorm(x, main = paste(i0, j0), pch = 19, col = i+10)
qqline(x)
}
}
par(mfcol = c(3, 4))
for (k in 1:4){
j0 <- names(iris)[k]
x0 <- seq(min(iris[k]), max(iris[k]), le = 50)
for (i in 1:3) {
i0 <- levels(iris$Species)[i]
x <- iris[iris$Species == i0, j0]
hist(x, proba = T, col = "green", main = paste("especie", i0), xlab = j0)
lines(x0, dnorm(x0, mean(x), sd(x)), col = "red", lwd = 2)
}
}
library(reshape2)
library(knitr)
library(dplyr)
datos_tidy2 <- melt(iris, value.name = "valor")
## Using Species as id variables
iris
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## 11 5.4 3.7 1.5 0.2 setosa
## 12 4.8 3.4 1.6 0.2 setosa
## 13 4.8 3.0 1.4 0.1 setosa
## 14 4.3 3.0 1.1 0.1 setosa
## 15 5.8 4.0 1.2 0.2 setosa
## 16 5.7 4.4 1.5 0.4 setosa
## 17 5.4 3.9 1.3 0.4 setosa
## 18 5.1 3.5 1.4 0.3 setosa
## 19 5.7 3.8 1.7 0.3 setosa
## 20 5.1 3.8 1.5 0.3 setosa
## 21 5.4 3.4 1.7 0.2 setosa
## 22 5.1 3.7 1.5 0.4 setosa
## 23 4.6 3.6 1.0 0.2 setosa
## 24 5.1 3.3 1.7 0.5 setosa
## 25 4.8 3.4 1.9 0.2 setosa
## 26 5.0 3.0 1.6 0.2 setosa
## 27 5.0 3.4 1.6 0.4 setosa
## 28 5.2 3.5 1.5 0.2 setosa
## 29 5.2 3.4 1.4 0.2 setosa
## 30 4.7 3.2 1.6 0.2 setosa
## 31 4.8 3.1 1.6 0.2 setosa
## 32 5.4 3.4 1.5 0.4 setosa
## 33 5.2 4.1 1.5 0.1 setosa
## 34 5.5 4.2 1.4 0.2 setosa
## 35 4.9 3.1 1.5 0.2 setosa
## 36 5.0 3.2 1.2 0.2 setosa
## 37 5.5 3.5 1.3 0.2 setosa
## 38 4.9 3.6 1.4 0.1 setosa
## 39 4.4 3.0 1.3 0.2 setosa
## 40 5.1 3.4 1.5 0.2 setosa
## 41 5.0 3.5 1.3 0.3 setosa
## 42 4.5 2.3 1.3 0.3 setosa
## 43 4.4 3.2 1.3 0.2 setosa
## 44 5.0 3.5 1.6 0.6 setosa
## 45 5.1 3.8 1.9 0.4 setosa
## 46 4.8 3.0 1.4 0.3 setosa
## 47 5.1 3.8 1.6 0.2 setosa
## 48 4.6 3.2 1.4 0.2 setosa
## 49 5.3 3.7 1.5 0.2 setosa
## 50 5.0 3.3 1.4 0.2 setosa
## 51 7.0 3.2 4.7 1.4 versicolor
## 52 6.4 3.2 4.5 1.5 versicolor
## 53 6.9 3.1 4.9 1.5 versicolor
## 54 5.5 2.3 4.0 1.3 versicolor
## 55 6.5 2.8 4.6 1.5 versicolor
## 56 5.7 2.8 4.5 1.3 versicolor
## 57 6.3 3.3 4.7 1.6 versicolor
## 58 4.9 2.4 3.3 1.0 versicolor
## 59 6.6 2.9 4.6 1.3 versicolor
## 60 5.2 2.7 3.9 1.4 versicolor
## 61 5.0 2.0 3.5 1.0 versicolor
## 62 5.9 3.0 4.2 1.5 versicolor
## 63 6.0 2.2 4.0 1.0 versicolor
## 64 6.1 2.9 4.7 1.4 versicolor
## 65 5.6 2.9 3.6 1.3 versicolor
## 66 6.7 3.1 4.4 1.4 versicolor
## 67 5.6 3.0 4.5 1.5 versicolor
## 68 5.8 2.7 4.1 1.0 versicolor
## 69 6.2 2.2 4.5 1.5 versicolor
## 70 5.6 2.5 3.9 1.1 versicolor
## 71 5.9 3.2 4.8 1.8 versicolor
## 72 6.1 2.8 4.0 1.3 versicolor
## 73 6.3 2.5 4.9 1.5 versicolor
## 74 6.1 2.8 4.7 1.2 versicolor
## 75 6.4 2.9 4.3 1.3 versicolor
## 76 6.6 3.0 4.4 1.4 versicolor
## 77 6.8 2.8 4.8 1.4 versicolor
## 78 6.7 3.0 5.0 1.7 versicolor
## 79 6.0 2.9 4.5 1.5 versicolor
## 80 5.7 2.6 3.5 1.0 versicolor
## 81 5.5 2.4 3.8 1.1 versicolor
## 82 5.5 2.4 3.7 1.0 versicolor
## 83 5.8 2.7 3.9 1.2 versicolor
## 84 6.0 2.7 5.1 1.6 versicolor
## 85 5.4 3.0 4.5 1.5 versicolor
## 86 6.0 3.4 4.5 1.6 versicolor
## 87 6.7 3.1 4.7 1.5 versicolor
## 88 6.3 2.3 4.4 1.3 versicolor
## 89 5.6 3.0 4.1 1.3 versicolor
## 90 5.5 2.5 4.0 1.3 versicolor
## 91 5.5 2.6 4.4 1.2 versicolor
## 92 6.1 3.0 4.6 1.4 versicolor
## 93 5.8 2.6 4.0 1.2 versicolor
## 94 5.0 2.3 3.3 1.0 versicolor
## 95 5.6 2.7 4.2 1.3 versicolor
## 96 5.7 3.0 4.2 1.2 versicolor
## 97 5.7 2.9 4.2 1.3 versicolor
## 98 6.2 2.9 4.3 1.3 versicolor
## 99 5.1 2.5 3.0 1.1 versicolor
## 100 5.7 2.8 4.1 1.3 versicolor
## 101 6.3 3.3 6.0 2.5 virginica
## 102 5.8 2.7 5.1 1.9 virginica
## 103 7.1 3.0 5.9 2.1 virginica
## 104 6.3 2.9 5.6 1.8 virginica
## 105 6.5 3.0 5.8 2.2 virginica
## 106 7.6 3.0 6.6 2.1 virginica
## 107 4.9 2.5 4.5 1.7 virginica
## 108 7.3 2.9 6.3 1.8 virginica
## 109 6.7 2.5 5.8 1.8 virginica
## 110 7.2 3.6 6.1 2.5 virginica
## 111 6.5 3.2 5.1 2.0 virginica
## 112 6.4 2.7 5.3 1.9 virginica
## 113 6.8 3.0 5.5 2.1 virginica
## 114 5.7 2.5 5.0 2.0 virginica
## 115 5.8 2.8 5.1 2.4 virginica
## 116 6.4 3.2 5.3 2.3 virginica
## 117 6.5 3.0 5.5 1.8 virginica
## 118 7.7 3.8 6.7 2.2 virginica
## 119 7.7 2.6 6.9 2.3 virginica
## 120 6.0 2.2 5.0 1.5 virginica
## 121 6.9 3.2 5.7 2.3 virginica
## 122 5.6 2.8 4.9 2.0 virginica
## 123 7.7 2.8 6.7 2.0 virginica
## 124 6.3 2.7 4.9 1.8 virginica
## 125 6.7 3.3 5.7 2.1 virginica
## 126 7.2 3.2 6.0 1.8 virginica
## 127 6.2 2.8 4.8 1.8 virginica
## 128 6.1 3.0 4.9 1.8 virginica
## 129 6.4 2.8 5.6 2.1 virginica
## 130 7.2 3.0 5.8 1.6 virginica
## 131 7.4 2.8 6.1 1.9 virginica
## 132 7.9 3.8 6.4 2.0 virginica
## 133 6.4 2.8 5.6 2.2 virginica
## 134 6.3 2.8 5.1 1.5 virginica
## 135 6.1 2.6 5.6 1.4 virginica
## 136 7.7 3.0 6.1 2.3 virginica
## 137 6.3 3.4 5.6 2.4 virginica
## 138 6.4 3.1 5.5 1.8 virginica
## 139 6.0 3.0 4.8 1.8 virginica
## 140 6.9 3.1 5.4 2.1 virginica
## 141 6.7 3.1 5.6 2.4 virginica
## 142 6.9 3.1 5.1 2.3 virginica
## 143 5.8 2.7 5.1 1.9 virginica
## 144 6.8 3.2 5.9 2.3 virginica
## 145 6.7 3.3 5.7 2.5 virginica
## 146 6.7 3.0 5.2 2.3 virginica
## 147 6.3 2.5 5.0 1.9 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3.0 5.1 1.8 virginica
datos_tidy
## especie variable valor
## 1 a pata 191
## 2 a pata 185
## 3 a pata 200
## 4 a pata 173
## 5 a pata 171
## 6 a pata 160
## 7 a pata 188
## 8 a pata 186
## 9 a pata 174
## 10 a pata 163
## 11 b pata 186
## 12 b pata 211
## 13 b pata 201
## 14 b pata 242
## 15 b pata 184
## 16 b pata 211
## 17 b pata 217
## 18 b pata 223
## 19 b pata 208
## 20 b pata 199
## 21 a abdomen 131
## 22 a abdomen 134
## 23 a abdomen 137
## 24 a abdomen 127
## 25 a abdomen 128
## 26 a abdomen 118
## 27 a abdomen 134
## 28 a abdomen 129
## 29 a abdomen 131
## 30 a abdomen 115
## 31 b abdomen 107
## 32 b abdomen 122
## 33 b abdomen 144
## 34 b abdomen 131
## 35 b abdomen 108
## 36 b abdomen 118
## 37 b abdomen 122
## 38 b abdomen 127
## 39 b abdomen 125
## 40 b abdomen 124
## 41 a organo_sexual 53
## 42 a organo_sexual 50
## 43 a organo_sexual 52
## 44 a organo_sexual 50
## 45 a organo_sexual 49
## 46 a organo_sexual 47
## 47 a organo_sexual 54
## 48 a organo_sexual 51
## 49 a organo_sexual 52
## 50 a organo_sexual 47
## 51 b organo_sexual 49
## 52 b organo_sexual 49
## 53 b organo_sexual 47
## 54 b organo_sexual 54
## 55 b organo_sexual 43
## 56 b organo_sexual 51
## 57 b organo_sexual 49
## 58 b organo_sexual 51
## 59 b organo_sexual 50
## 60 b organo_sexual 46
datos_tidy2
## Species variable valor
## 1 setosa Sepal.Length 5.1
## 2 setosa Sepal.Length 4.9
## 3 setosa Sepal.Length 4.7
## 4 setosa Sepal.Length 4.6
## 5 setosa Sepal.Length 5.0
## 6 setosa Sepal.Length 5.4
## 7 setosa Sepal.Length 4.6
## 8 setosa Sepal.Length 5.0
## 9 setosa Sepal.Length 4.4
## 10 setosa Sepal.Length 4.9
## 11 setosa Sepal.Length 5.4
## 12 setosa Sepal.Length 4.8
## 13 setosa Sepal.Length 4.8
## 14 setosa Sepal.Length 4.3
## 15 setosa Sepal.Length 5.8
## 16 setosa Sepal.Length 5.7
## 17 setosa Sepal.Length 5.4
## 18 setosa Sepal.Length 5.1
## 19 setosa Sepal.Length 5.7
## 20 setosa Sepal.Length 5.1
## 21 setosa Sepal.Length 5.4
## 22 setosa Sepal.Length 5.1
## 23 setosa Sepal.Length 4.6
## 24 setosa Sepal.Length 5.1
## 25 setosa Sepal.Length 4.8
## 26 setosa Sepal.Length 5.0
## 27 setosa Sepal.Length 5.0
## 28 setosa Sepal.Length 5.2
## 29 setosa Sepal.Length 5.2
## 30 setosa Sepal.Length 4.7
## 31 setosa Sepal.Length 4.8
## 32 setosa Sepal.Length 5.4
## 33 setosa Sepal.Length 5.2
## 34 setosa Sepal.Length 5.5
## 35 setosa Sepal.Length 4.9
## 36 setosa Sepal.Length 5.0
## 37 setosa Sepal.Length 5.5
## 38 setosa Sepal.Length 4.9
## 39 setosa Sepal.Length 4.4
## 40 setosa Sepal.Length 5.1
## 41 setosa Sepal.Length 5.0
## 42 setosa Sepal.Length 4.5
## 43 setosa Sepal.Length 4.4
## 44 setosa Sepal.Length 5.0
## 45 setosa Sepal.Length 5.1
## 46 setosa Sepal.Length 4.8
## 47 setosa Sepal.Length 5.1
## 48 setosa Sepal.Length 4.6
## 49 setosa Sepal.Length 5.3
## 50 setosa Sepal.Length 5.0
## 51 versicolor Sepal.Length 7.0
## 52 versicolor Sepal.Length 6.4
## 53 versicolor Sepal.Length 6.9
## 54 versicolor Sepal.Length 5.5
## 55 versicolor Sepal.Length 6.5
## 56 versicolor Sepal.Length 5.7
## 57 versicolor Sepal.Length 6.3
## 58 versicolor Sepal.Length 4.9
## 59 versicolor Sepal.Length 6.6
## 60 versicolor Sepal.Length 5.2
## 61 versicolor Sepal.Length 5.0
## 62 versicolor Sepal.Length 5.9
## 63 versicolor Sepal.Length 6.0
## 64 versicolor Sepal.Length 6.1
## 65 versicolor Sepal.Length 5.6
## 66 versicolor Sepal.Length 6.7
## 67 versicolor Sepal.Length 5.6
## 68 versicolor Sepal.Length 5.8
## 69 versicolor Sepal.Length 6.2
## 70 versicolor Sepal.Length 5.6
## 71 versicolor Sepal.Length 5.9
## 72 versicolor Sepal.Length 6.1
## 73 versicolor Sepal.Length 6.3
## 74 versicolor Sepal.Length 6.1
## 75 versicolor Sepal.Length 6.4
## 76 versicolor Sepal.Length 6.6
## 77 versicolor Sepal.Length 6.8
## 78 versicolor Sepal.Length 6.7
## 79 versicolor Sepal.Length 6.0
## 80 versicolor Sepal.Length 5.7
## 81 versicolor Sepal.Length 5.5
## 82 versicolor Sepal.Length 5.5
## 83 versicolor Sepal.Length 5.8
## 84 versicolor Sepal.Length 6.0
## 85 versicolor Sepal.Length 5.4
## 86 versicolor Sepal.Length 6.0
## 87 versicolor Sepal.Length 6.7
## 88 versicolor Sepal.Length 6.3
## 89 versicolor Sepal.Length 5.6
## 90 versicolor Sepal.Length 5.5
## 91 versicolor Sepal.Length 5.5
## 92 versicolor Sepal.Length 6.1
## 93 versicolor Sepal.Length 5.8
## 94 versicolor Sepal.Length 5.0
## 95 versicolor Sepal.Length 5.6
## 96 versicolor Sepal.Length 5.7
## 97 versicolor Sepal.Length 5.7
## 98 versicolor Sepal.Length 6.2
## 99 versicolor Sepal.Length 5.1
## 100 versicolor Sepal.Length 5.7
## 101 virginica Sepal.Length 6.3
## 102 virginica Sepal.Length 5.8
## 103 virginica Sepal.Length 7.1
## 104 virginica Sepal.Length 6.3
## 105 virginica Sepal.Length 6.5
## 106 virginica Sepal.Length 7.6
## 107 virginica Sepal.Length 4.9
## 108 virginica Sepal.Length 7.3
## 109 virginica Sepal.Length 6.7
## 110 virginica Sepal.Length 7.2
## 111 virginica Sepal.Length 6.5
## 112 virginica Sepal.Length 6.4
## 113 virginica Sepal.Length 6.8
## 114 virginica Sepal.Length 5.7
## 115 virginica Sepal.Length 5.8
## 116 virginica Sepal.Length 6.4
## 117 virginica Sepal.Length 6.5
## 118 virginica Sepal.Length 7.7
## 119 virginica Sepal.Length 7.7
## 120 virginica Sepal.Length 6.0
## 121 virginica Sepal.Length 6.9
## 122 virginica Sepal.Length 5.6
## 123 virginica Sepal.Length 7.7
## 124 virginica Sepal.Length 6.3
## 125 virginica Sepal.Length 6.7
## 126 virginica Sepal.Length 7.2
## 127 virginica Sepal.Length 6.2
## 128 virginica Sepal.Length 6.1
## 129 virginica Sepal.Length 6.4
## 130 virginica Sepal.Length 7.2
## 131 virginica Sepal.Length 7.4
## 132 virginica Sepal.Length 7.9
## 133 virginica Sepal.Length 6.4
## 134 virginica Sepal.Length 6.3
## 135 virginica Sepal.Length 6.1
## 136 virginica Sepal.Length 7.7
## 137 virginica Sepal.Length 6.3
## 138 virginica Sepal.Length 6.4
## 139 virginica Sepal.Length 6.0
## 140 virginica Sepal.Length 6.9
## 141 virginica Sepal.Length 6.7
## 142 virginica Sepal.Length 6.9
## 143 virginica Sepal.Length 5.8
## 144 virginica Sepal.Length 6.8
## 145 virginica Sepal.Length 6.7
## 146 virginica Sepal.Length 6.7
## 147 virginica Sepal.Length 6.3
## 148 virginica Sepal.Length 6.5
## 149 virginica Sepal.Length 6.2
## 150 virginica Sepal.Length 5.9
## 151 setosa Sepal.Width 3.5
## 152 setosa Sepal.Width 3.0
## 153 setosa Sepal.Width 3.2
## 154 setosa Sepal.Width 3.1
## 155 setosa Sepal.Width 3.6
## 156 setosa Sepal.Width 3.9
## 157 setosa Sepal.Width 3.4
## 158 setosa Sepal.Width 3.4
## 159 setosa Sepal.Width 2.9
## 160 setosa Sepal.Width 3.1
## 161 setosa Sepal.Width 3.7
## 162 setosa Sepal.Width 3.4
## 163 setosa Sepal.Width 3.0
## 164 setosa Sepal.Width 3.0
## 165 setosa Sepal.Width 4.0
## 166 setosa Sepal.Width 4.4
## 167 setosa Sepal.Width 3.9
## 168 setosa Sepal.Width 3.5
## 169 setosa Sepal.Width 3.8
## 170 setosa Sepal.Width 3.8
## 171 setosa Sepal.Width 3.4
## 172 setosa Sepal.Width 3.7
## 173 setosa Sepal.Width 3.6
## 174 setosa Sepal.Width 3.3
## 175 setosa Sepal.Width 3.4
## 176 setosa Sepal.Width 3.0
## 177 setosa Sepal.Width 3.4
## 178 setosa Sepal.Width 3.5
## 179 setosa Sepal.Width 3.4
## 180 setosa Sepal.Width 3.2
## 181 setosa Sepal.Width 3.1
## 182 setosa Sepal.Width 3.4
## 183 setosa Sepal.Width 4.1
## 184 setosa Sepal.Width 4.2
## 185 setosa Sepal.Width 3.1
## 186 setosa Sepal.Width 3.2
## 187 setosa Sepal.Width 3.5
## 188 setosa Sepal.Width 3.6
## 189 setosa Sepal.Width 3.0
## 190 setosa Sepal.Width 3.4
## 191 setosa Sepal.Width 3.5
## 192 setosa Sepal.Width 2.3
## 193 setosa Sepal.Width 3.2
## 194 setosa Sepal.Width 3.5
## 195 setosa Sepal.Width 3.8
## 196 setosa Sepal.Width 3.0
## 197 setosa Sepal.Width 3.8
## 198 setosa Sepal.Width 3.2
## 199 setosa Sepal.Width 3.7
## 200 setosa Sepal.Width 3.3
## 201 versicolor Sepal.Width 3.2
## 202 versicolor Sepal.Width 3.2
## 203 versicolor Sepal.Width 3.1
## 204 versicolor Sepal.Width 2.3
## 205 versicolor Sepal.Width 2.8
## 206 versicolor Sepal.Width 2.8
## 207 versicolor Sepal.Width 3.3
## 208 versicolor Sepal.Width 2.4
## 209 versicolor Sepal.Width 2.9
## 210 versicolor Sepal.Width 2.7
## 211 versicolor Sepal.Width 2.0
## 212 versicolor Sepal.Width 3.0
## 213 versicolor Sepal.Width 2.2
## 214 versicolor Sepal.Width 2.9
## 215 versicolor Sepal.Width 2.9
## 216 versicolor Sepal.Width 3.1
## 217 versicolor Sepal.Width 3.0
## 218 versicolor Sepal.Width 2.7
## 219 versicolor Sepal.Width 2.2
## 220 versicolor Sepal.Width 2.5
## 221 versicolor Sepal.Width 3.2
## 222 versicolor Sepal.Width 2.8
## 223 versicolor Sepal.Width 2.5
## 224 versicolor Sepal.Width 2.8
## 225 versicolor Sepal.Width 2.9
## 226 versicolor Sepal.Width 3.0
## 227 versicolor Sepal.Width 2.8
## 228 versicolor Sepal.Width 3.0
## 229 versicolor Sepal.Width 2.9
## 230 versicolor Sepal.Width 2.6
## 231 versicolor Sepal.Width 2.4
## 232 versicolor Sepal.Width 2.4
## 233 versicolor Sepal.Width 2.7
## 234 versicolor Sepal.Width 2.7
## 235 versicolor Sepal.Width 3.0
## 236 versicolor Sepal.Width 3.4
## 237 versicolor Sepal.Width 3.1
## 238 versicolor Sepal.Width 2.3
## 239 versicolor Sepal.Width 3.0
## 240 versicolor Sepal.Width 2.5
## 241 versicolor Sepal.Width 2.6
## 242 versicolor Sepal.Width 3.0
## 243 versicolor Sepal.Width 2.6
## 244 versicolor Sepal.Width 2.3
## 245 versicolor Sepal.Width 2.7
## 246 versicolor Sepal.Width 3.0
## 247 versicolor Sepal.Width 2.9
## 248 versicolor Sepal.Width 2.9
## 249 versicolor Sepal.Width 2.5
## 250 versicolor Sepal.Width 2.8
## 251 virginica Sepal.Width 3.3
## 252 virginica Sepal.Width 2.7
## 253 virginica Sepal.Width 3.0
## 254 virginica Sepal.Width 2.9
## 255 virginica Sepal.Width 3.0
## 256 virginica Sepal.Width 3.0
## 257 virginica Sepal.Width 2.5
## 258 virginica Sepal.Width 2.9
## 259 virginica Sepal.Width 2.5
## 260 virginica Sepal.Width 3.6
## 261 virginica Sepal.Width 3.2
## 262 virginica Sepal.Width 2.7
## 263 virginica Sepal.Width 3.0
## 264 virginica Sepal.Width 2.5
## 265 virginica Sepal.Width 2.8
## 266 virginica Sepal.Width 3.2
## 267 virginica Sepal.Width 3.0
## 268 virginica Sepal.Width 3.8
## 269 virginica Sepal.Width 2.6
## 270 virginica Sepal.Width 2.2
## 271 virginica Sepal.Width 3.2
## 272 virginica Sepal.Width 2.8
## 273 virginica Sepal.Width 2.8
## 274 virginica Sepal.Width 2.7
## 275 virginica Sepal.Width 3.3
## 276 virginica Sepal.Width 3.2
## 277 virginica Sepal.Width 2.8
## 278 virginica Sepal.Width 3.0
## 279 virginica Sepal.Width 2.8
## 280 virginica Sepal.Width 3.0
## 281 virginica Sepal.Width 2.8
## 282 virginica Sepal.Width 3.8
## 283 virginica Sepal.Width 2.8
## 284 virginica Sepal.Width 2.8
## 285 virginica Sepal.Width 2.6
## 286 virginica Sepal.Width 3.0
## 287 virginica Sepal.Width 3.4
## 288 virginica Sepal.Width 3.1
## 289 virginica Sepal.Width 3.0
## 290 virginica Sepal.Width 3.1
## 291 virginica Sepal.Width 3.1
## 292 virginica Sepal.Width 3.1
## 293 virginica Sepal.Width 2.7
## 294 virginica Sepal.Width 3.2
## 295 virginica Sepal.Width 3.3
## 296 virginica Sepal.Width 3.0
## 297 virginica Sepal.Width 2.5
## 298 virginica Sepal.Width 3.0
## 299 virginica Sepal.Width 3.4
## 300 virginica Sepal.Width 3.0
## 301 setosa Petal.Length 1.4
## 302 setosa Petal.Length 1.4
## 303 setosa Petal.Length 1.3
## 304 setosa Petal.Length 1.5
## 305 setosa Petal.Length 1.4
## 306 setosa Petal.Length 1.7
## 307 setosa Petal.Length 1.4
## 308 setosa Petal.Length 1.5
## 309 setosa Petal.Length 1.4
## 310 setosa Petal.Length 1.5
## 311 setosa Petal.Length 1.5
## 312 setosa Petal.Length 1.6
## 313 setosa Petal.Length 1.4
## 314 setosa Petal.Length 1.1
## 315 setosa Petal.Length 1.2
## 316 setosa Petal.Length 1.5
## 317 setosa Petal.Length 1.3
## 318 setosa Petal.Length 1.4
## 319 setosa Petal.Length 1.7
## 320 setosa Petal.Length 1.5
## 321 setosa Petal.Length 1.7
## 322 setosa Petal.Length 1.5
## 323 setosa Petal.Length 1.0
## 324 setosa Petal.Length 1.7
## 325 setosa Petal.Length 1.9
## 326 setosa Petal.Length 1.6
## 327 setosa Petal.Length 1.6
## 328 setosa Petal.Length 1.5
## 329 setosa Petal.Length 1.4
## 330 setosa Petal.Length 1.6
## 331 setosa Petal.Length 1.6
## 332 setosa Petal.Length 1.5
## 333 setosa Petal.Length 1.5
## 334 setosa Petal.Length 1.4
## 335 setosa Petal.Length 1.5
## 336 setosa Petal.Length 1.2
## 337 setosa Petal.Length 1.3
## 338 setosa Petal.Length 1.4
## 339 setosa Petal.Length 1.3
## 340 setosa Petal.Length 1.5
## 341 setosa Petal.Length 1.3
## 342 setosa Petal.Length 1.3
## 343 setosa Petal.Length 1.3
## 344 setosa Petal.Length 1.6
## 345 setosa Petal.Length 1.9
## 346 setosa Petal.Length 1.4
## 347 setosa Petal.Length 1.6
## 348 setosa Petal.Length 1.4
## 349 setosa Petal.Length 1.5
## 350 setosa Petal.Length 1.4
## 351 versicolor Petal.Length 4.7
## 352 versicolor Petal.Length 4.5
## 353 versicolor Petal.Length 4.9
## 354 versicolor Petal.Length 4.0
## 355 versicolor Petal.Length 4.6
## 356 versicolor Petal.Length 4.5
## 357 versicolor Petal.Length 4.7
## 358 versicolor Petal.Length 3.3
## 359 versicolor Petal.Length 4.6
## 360 versicolor Petal.Length 3.9
## 361 versicolor Petal.Length 3.5
## 362 versicolor Petal.Length 4.2
## 363 versicolor Petal.Length 4.0
## 364 versicolor Petal.Length 4.7
## 365 versicolor Petal.Length 3.6
## 366 versicolor Petal.Length 4.4
## 367 versicolor Petal.Length 4.5
## 368 versicolor Petal.Length 4.1
## 369 versicolor Petal.Length 4.5
## 370 versicolor Petal.Length 3.9
## 371 versicolor Petal.Length 4.8
## 372 versicolor Petal.Length 4.0
## 373 versicolor Petal.Length 4.9
## 374 versicolor Petal.Length 4.7
## 375 versicolor Petal.Length 4.3
## 376 versicolor Petal.Length 4.4
## 377 versicolor Petal.Length 4.8
## 378 versicolor Petal.Length 5.0
## 379 versicolor Petal.Length 4.5
## 380 versicolor Petal.Length 3.5
## 381 versicolor Petal.Length 3.8
## 382 versicolor Petal.Length 3.7
## 383 versicolor Petal.Length 3.9
## 384 versicolor Petal.Length 5.1
## 385 versicolor Petal.Length 4.5
## 386 versicolor Petal.Length 4.5
## 387 versicolor Petal.Length 4.7
## 388 versicolor Petal.Length 4.4
## 389 versicolor Petal.Length 4.1
## 390 versicolor Petal.Length 4.0
## 391 versicolor Petal.Length 4.4
## 392 versicolor Petal.Length 4.6
## 393 versicolor Petal.Length 4.0
## 394 versicolor Petal.Length 3.3
## 395 versicolor Petal.Length 4.2
## 396 versicolor Petal.Length 4.2
## 397 versicolor Petal.Length 4.2
## 398 versicolor Petal.Length 4.3
## 399 versicolor Petal.Length 3.0
## 400 versicolor Petal.Length 4.1
## 401 virginica Petal.Length 6.0
## 402 virginica Petal.Length 5.1
## 403 virginica Petal.Length 5.9
## 404 virginica Petal.Length 5.6
## 405 virginica Petal.Length 5.8
## 406 virginica Petal.Length 6.6
## 407 virginica Petal.Length 4.5
## 408 virginica Petal.Length 6.3
## 409 virginica Petal.Length 5.8
## 410 virginica Petal.Length 6.1
## 411 virginica Petal.Length 5.1
## 412 virginica Petal.Length 5.3
## 413 virginica Petal.Length 5.5
## 414 virginica Petal.Length 5.0
## 415 virginica Petal.Length 5.1
## 416 virginica Petal.Length 5.3
## 417 virginica Petal.Length 5.5
## 418 virginica Petal.Length 6.7
## 419 virginica Petal.Length 6.9
## 420 virginica Petal.Length 5.0
## 421 virginica Petal.Length 5.7
## 422 virginica Petal.Length 4.9
## 423 virginica Petal.Length 6.7
## 424 virginica Petal.Length 4.9
## 425 virginica Petal.Length 5.7
## 426 virginica Petal.Length 6.0
## 427 virginica Petal.Length 4.8
## 428 virginica Petal.Length 4.9
## 429 virginica Petal.Length 5.6
## 430 virginica Petal.Length 5.8
## 431 virginica Petal.Length 6.1
## 432 virginica Petal.Length 6.4
## 433 virginica Petal.Length 5.6
## 434 virginica Petal.Length 5.1
## 435 virginica Petal.Length 5.6
## 436 virginica Petal.Length 6.1
## 437 virginica Petal.Length 5.6
## 438 virginica Petal.Length 5.5
## 439 virginica Petal.Length 4.8
## 440 virginica Petal.Length 5.4
## 441 virginica Petal.Length 5.6
## 442 virginica Petal.Length 5.1
## 443 virginica Petal.Length 5.1
## 444 virginica Petal.Length 5.9
## 445 virginica Petal.Length 5.7
## 446 virginica Petal.Length 5.2
## 447 virginica Petal.Length 5.0
## 448 virginica Petal.Length 5.2
## 449 virginica Petal.Length 5.4
## 450 virginica Petal.Length 5.1
## 451 setosa Petal.Width 0.2
## 452 setosa Petal.Width 0.2
## 453 setosa Petal.Width 0.2
## 454 setosa Petal.Width 0.2
## 455 setosa Petal.Width 0.2
## 456 setosa Petal.Width 0.4
## 457 setosa Petal.Width 0.3
## 458 setosa Petal.Width 0.2
## 459 setosa Petal.Width 0.2
## 460 setosa Petal.Width 0.1
## 461 setosa Petal.Width 0.2
## 462 setosa Petal.Width 0.2
## 463 setosa Petal.Width 0.1
## 464 setosa Petal.Width 0.1
## 465 setosa Petal.Width 0.2
## 466 setosa Petal.Width 0.4
## 467 setosa Petal.Width 0.4
## 468 setosa Petal.Width 0.3
## 469 setosa Petal.Width 0.3
## 470 setosa Petal.Width 0.3
## 471 setosa Petal.Width 0.2
## 472 setosa Petal.Width 0.4
## 473 setosa Petal.Width 0.2
## 474 setosa Petal.Width 0.5
## 475 setosa Petal.Width 0.2
## 476 setosa Petal.Width 0.2
## 477 setosa Petal.Width 0.4
## 478 setosa Petal.Width 0.2
## 479 setosa Petal.Width 0.2
## 480 setosa Petal.Width 0.2
## 481 setosa Petal.Width 0.2
## 482 setosa Petal.Width 0.4
## 483 setosa Petal.Width 0.1
## 484 setosa Petal.Width 0.2
## 485 setosa Petal.Width 0.2
## 486 setosa Petal.Width 0.2
## 487 setosa Petal.Width 0.2
## 488 setosa Petal.Width 0.1
## 489 setosa Petal.Width 0.2
## 490 setosa Petal.Width 0.2
## 491 setosa Petal.Width 0.3
## 492 setosa Petal.Width 0.3
## 493 setosa Petal.Width 0.2
## 494 setosa Petal.Width 0.6
## 495 setosa Petal.Width 0.4
## 496 setosa Petal.Width 0.3
## 497 setosa Petal.Width 0.2
## 498 setosa Petal.Width 0.2
## 499 setosa Petal.Width 0.2
## 500 setosa Petal.Width 0.2
## 501 versicolor Petal.Width 1.4
## 502 versicolor Petal.Width 1.5
## 503 versicolor Petal.Width 1.5
## 504 versicolor Petal.Width 1.3
## 505 versicolor Petal.Width 1.5
## 506 versicolor Petal.Width 1.3
## 507 versicolor Petal.Width 1.6
## 508 versicolor Petal.Width 1.0
## 509 versicolor Petal.Width 1.3
## 510 versicolor Petal.Width 1.4
## 511 versicolor Petal.Width 1.0
## 512 versicolor Petal.Width 1.5
## 513 versicolor Petal.Width 1.0
## 514 versicolor Petal.Width 1.4
## 515 versicolor Petal.Width 1.3
## 516 versicolor Petal.Width 1.4
## 517 versicolor Petal.Width 1.5
## 518 versicolor Petal.Width 1.0
## 519 versicolor Petal.Width 1.5
## 520 versicolor Petal.Width 1.1
## 521 versicolor Petal.Width 1.8
## 522 versicolor Petal.Width 1.3
## 523 versicolor Petal.Width 1.5
## 524 versicolor Petal.Width 1.2
## 525 versicolor Petal.Width 1.3
## 526 versicolor Petal.Width 1.4
## 527 versicolor Petal.Width 1.4
## 528 versicolor Petal.Width 1.7
## 529 versicolor Petal.Width 1.5
## 530 versicolor Petal.Width 1.0
## 531 versicolor Petal.Width 1.1
## 532 versicolor Petal.Width 1.0
## 533 versicolor Petal.Width 1.2
## 534 versicolor Petal.Width 1.6
## 535 versicolor Petal.Width 1.5
## 536 versicolor Petal.Width 1.6
## 537 versicolor Petal.Width 1.5
## 538 versicolor Petal.Width 1.3
## 539 versicolor Petal.Width 1.3
## 540 versicolor Petal.Width 1.3
## 541 versicolor Petal.Width 1.2
## 542 versicolor Petal.Width 1.4
## 543 versicolor Petal.Width 1.2
## 544 versicolor Petal.Width 1.0
## 545 versicolor Petal.Width 1.3
## 546 versicolor Petal.Width 1.2
## 547 versicolor Petal.Width 1.3
## 548 versicolor Petal.Width 1.3
## 549 versicolor Petal.Width 1.1
## 550 versicolor Petal.Width 1.3
## 551 virginica Petal.Width 2.5
## 552 virginica Petal.Width 1.9
## 553 virginica Petal.Width 2.1
## 554 virginica Petal.Width 1.8
## 555 virginica Petal.Width 2.2
## 556 virginica Petal.Width 2.1
## 557 virginica Petal.Width 1.7
## 558 virginica Petal.Width 1.8
## 559 virginica Petal.Width 1.8
## 560 virginica Petal.Width 2.5
## 561 virginica Petal.Width 2.0
## 562 virginica Petal.Width 1.9
## 563 virginica Petal.Width 2.1
## 564 virginica Petal.Width 2.0
## 565 virginica Petal.Width 2.4
## 566 virginica Petal.Width 2.3
## 567 virginica Petal.Width 1.8
## 568 virginica Petal.Width 2.2
## 569 virginica Petal.Width 2.3
## 570 virginica Petal.Width 1.5
## 571 virginica Petal.Width 2.3
## 572 virginica Petal.Width 2.0
## 573 virginica Petal.Width 2.0
## 574 virginica Petal.Width 1.8
## 575 virginica Petal.Width 2.1
## 576 virginica Petal.Width 1.8
## 577 virginica Petal.Width 1.8
## 578 virginica Petal.Width 1.8
## 579 virginica Petal.Width 2.1
## 580 virginica Petal.Width 1.6
## 581 virginica Petal.Width 1.9
## 582 virginica Petal.Width 2.0
## 583 virginica Petal.Width 2.2
## 584 virginica Petal.Width 1.5
## 585 virginica Petal.Width 1.4
## 586 virginica Petal.Width 2.3
## 587 virginica Petal.Width 2.4
## 588 virginica Petal.Width 1.8
## 589 virginica Petal.Width 1.8
## 590 virginica Petal.Width 2.1
## 591 virginica Petal.Width 2.4
## 592 virginica Petal.Width 2.3
## 593 virginica Petal.Width 1.9
## 594 virginica Petal.Width 2.3
## 595 virginica Petal.Width 2.5
## 596 virginica Petal.Width 2.3
## 597 virginica Petal.Width 1.9
## 598 virginica Petal.Width 2.0
## 599 virginica Petal.Width 2.3
## 600 virginica Petal.Width 1.8
kable(datos_tidy2 %>% group_by(Species, variable) %>% summarise(p_value_S = round(shapiro.test(valor)$p.value,4)))
## `summarise()` has grouped output by 'Species'. You can override using the
## `.groups` argument.
| Species | variable | p_value_S |
|---|---|---|
| setosa | Sepal.Length | 0.4595 |
| setosa | Sepal.Width | 0.2715 |
| setosa | Petal.Length | 0.0548 |
| setosa | Petal.Width | 0.0000 |
| versicolor | Sepal.Length | 0.4647 |
| versicolor | Sepal.Width | 0.3380 |
| versicolor | Petal.Length | 0.1585 |
| versicolor | Petal.Width | 0.0273 |
| virginica | Sepal.Length | 0.2583 |
| virginica | Sepal.Width | 0.1809 |
| virginica | Petal.Length | 0.1098 |
| virginica | Petal.Width | 0.0870 |
Se acepta normalidad excepto para setosa/petal.width y versicolor/petal.width
#OUTLIERS
#--------------------
library(MVN)
out2 <- mvn(data=iris[,-5], mvnTest ="hz", multivariateOutlierMethod = "quan")
royston_test2 <- mvn(data = iris[,-5], mvnTest = "royston", multivariatePlot = "qq")
royston_test2$multivariateNormality
## Test H p value MVN
## 1 Royston 50.39667 3.098229e-11 NO
No se acepta la normalidad multivariante, debido a la presencia de atípicos.
hz_test2 <- mvn(data= iris[,-5], mvnTest ="hz")
hz_test2$multivariateNormality
## Test HZ p value MVN
## 1 Henze-Zirkler 2.336394 0 NO
Ambos test muestran evidencias significativas de falta de normalidad multivariante. El LDA tiene cierta robustez frente a la falta de normalidad multivariante, pero es importante tenerlo en cuenta en la conclusión del análisis.
library(biotools)
boxM(data=iris[,-5], grouping = iris[,5])
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: iris[, -5]
## Chi-Sq (approx.) = 140.94, df = 20, p-value < 2.2e-16
Se rechaza H0 indicando que las matrices de varianza y covarianza son diferentes (tenemos problemas de heterocedasticidad).
El test Box’s M muestra evidencias de que la matriz de covarianza no es constante en todos los grupos, lo que a priori descartaría el método LDA en favor de QDA.
Sin embargo, como el test Box’s M es muy sensible a la falta de normalidad multivariante, con frecuencia resulta significativo, no porque la matriz de covarianza no sea constante sino por la falta de normalidad, cosa que ocurre para los datos de Iris. Por esta razón, se va a asumir que la matriz de covarianza sí es constante y que LDA puede alcanzar una buena precisión en la clasificación. En la evaluación del modelo se verá como de buena es esta aproximación. Además, en las conclusiones se debe explicar la asunción hecha.
library(MASS)
modelo_lda <- lda(Species ~Sepal.Width + Sepal.Length + Petal.Length + Petal.Width, data = iris)
modelo_lda
## Call:
## lda(Species ~ Sepal.Width + Sepal.Length + Petal.Length + Petal.Width,
## data = iris)
##
## Prior probabilities of groups:
## setosa versicolor virginica
## 0.3333333 0.3333333 0.3333333
##
## Group means:
## Sepal.Width Sepal.Length Petal.Length Petal.Width
## setosa 3.428 5.006 1.462 0.246
## versicolor 2.770 5.936 4.260 1.326
## virginica 2.974 6.588 5.552 2.026
##
## Coefficients of linear discriminants:
## LD1 LD2
## Sepal.Width 1.5344731 -2.16452123
## Sepal.Length 0.8293776 -0.02410215
## Petal.Length -2.2012117 0.93192121
## Petal.Width -2.8104603 -2.83918785
##
## Proportion of trace:
## LD1 LD2
## 0.9912 0.0088
predicciones2 <- predict(object = modelo_lda, newdata = iris[, -5])
table(iris$Species, predicciones2$class, dnn = c("Clase real", "Clase predicha"))
## Clase predicha
## Clase real setosa versicolor virginica
## setosa 50 0 0
## versicolor 0 48 2
## virginica 0 1 49
fiabilidad = (50+48+49)/(50+0+0+0+48+2+0+1+49) * 100
paste("fiabilidad", fiabilidad, "%")
## [1] "fiabilidad 98 %"
training_error <- mean(iris$Species != predicciones2$class)*100
paste("training_error", training_error, "%")
## [1] "training_error 2 %"
library(klaR)
partimat(Species ~ Sepal.Width + Sepal.Length +Petal.Length + Petal.Width,
data = iris, method = "lda", prec = 200, image.colors=c("lightblue", "pink", "green"),
col.mean = "red")