El Análisis Discriminante es un análisis estadístico que permite clasificar n individuos en g grupos previamente especificados. Es decir, a partir de un conjunto variables medidas sobre un determinado número de individuos, de los que previamente sabemos que pertenecen a dos o más grupos, se obtienen una o varias funciones que permiten clasificar a cada individuo en un grupo determinado. A pesar de esta aparente complejidad en su definición, realizar un análisis discriminante en R es muy sencillo a partir del uso de la función lda contenida en el paquete MASS.
Este análisis tiene una importante función, y es la predictiva, ya que permite predecir a qué grupo pertenecerían otros individuos que no fueron usados para el desarrollo de la función discriminante. Para ello, necesitamos concretar los datos
- Muestra de adiestramiento (training sample): lo conforman los datos que conocemos de antemano a qué grupo pertenecen. Con estos datos se generan la/s función/es discriminante/s.
- Muestra experimental (test sample): lo conforman los datos de los que no conocemos a qué grupo pertenecen pero queremos predecir cuál sería usando la función discriminante generada por la muestra de adiestramiento.
Una vez hecha esta breve introducción teórica y determinado qué es una muestra de adiestramiento y experimental, veremos un ejemplo práctico para fijar los conceptos y ver cómo se soluciona usando R Commander.
- Respecto a la muestra de adiestramiento (77 flores):
- ¿Cuál es la función discriminante que nos permite diferenciar las dos especies usando las tres variables medidas?
- Si aplicamos dicha función sobre las mismas 77 flores… ¿qué eficacia tiene dicha función en clasificar correctamente esas flores? Y a continuación… ¿cuál es su porcentaje de error?
- Respecto a la muestra experimental (21 flores):
- ¿Cuántas pertenecerían a la Especie A?
- ¿Cuántas pertenecerían a la Especie B?
- ¿Cuántas podrían estar mal agrupadas teniendo en cuenta el porcentaje de error de la función discriminante sobre la muestra de adiestramiento?
Todas estas preguntas se van a resolver en 2 pasos sencillísimos en R Commander.
Quiero leer...
Paso 1. Cargando los datos en R Commander
Antes de realizar un análisis discriminante en R es necesario, obviamente, cargar los datos con los que vamos a trabajar. Primero cargamos los datos de la Muestra de adiestramiento por un lado y de la Muestra experimental por otro. En total tendremos dos tablas o conjunto de datos.
Es muy importante que los nombres de las columnas sean iguales entre una tabla y la otra. A continuación se ponen los enlaces para descargar los datos con los que realizaremos el ejemplo:
- Descargar Muestra experimental.
- Descargar Muestra de adiestramiento.
Cargamos las tablas en R Commander
Importamos ahora cada tabla por separado dándolas el nombre de Adiestramiento y Experimental, respectivamente, como se ve a continuación:
Vemos los datos a continuación presionando sobre Visualizar conjunto de datos:
Paso 2. Ejecutando el análisis discriminante usando la función «lda» para realizar un análisis discriminante en R
Para poder realizar un análisis discriminante en R, es indispensable cargar la librería MASS, librería donde se encuentra la función «lda» (linear discriminant analysis). Aquí sabréis cómo pueden cargarse librerías en R Commander.
Ahora, copiamos el siguiente código…
[sourcecode lang=»r»] # Selecciona el nombre de la columna que funciona como factor en la muestra de adiestramiento con el nombre de AdiestramientoColumn_factor=names(Adiestramiento)[sapply(Adiestramiento, class)=="factor"]# Estas funciones realizan el análisis discriminante y evalúan su eficacia testeándola con la muestra de adiestramiento
lda=lda(as.formula(paste(Column_factor,"~.",sep="")),data=Adiestramiento)
plot(lda) # Este es el gráfico en el que se observan los grupos
lda # Aquí salen los coeficientes de la/s función/es discriminate/s
lda$counts # Este es el número total de observaciones por grupo
lda$svd
lda.p=predict(lda)
Tabla=table(Adiestramiento[,Column_factor],lda.p$class)
Tabla # En FILAS los reales y en COLUMNAS los estimados
diag(prop.table(Tabla, 1)) # Porcentajes de aciertos por grupo en la muestra de adiestramiento
sum(diag(prop.table(Tabla))) # Porcentaje de acierto total en la muestra de adiestramiento
# Estas funciones estiman los grupos a los que pertenecerían las observaciones de la muestra experimental recogidas en el conjunto de datos llamados Experimental
pred=predict(lda,Experimental)$class
Experimental$Grupo_Estimado=with(Experimental,pred)
Experimental
[/sourcecode]
… y lo pegamos en R Commander en la pestaña de R Script. Si el primer paso de introducir las tablas con sus nombres lo hemos hecho correctamente, NO HAY QUE CAMBIAR NADA DEL CÓDIGO. Lo seleccionamos completamente y presionamos sobre Ejecutar:
Y listo. Todos los resultados necesarios aparecen. Solo queda su interpretación.
Resultados e interpretación del análisis discrimiante
Al realizar un análisis discriminante en R siguiendo el código descrito previamente, se obtienen los siguientes resultados, entre los que destaca la siguiente figura:
> # Selecciona el nombre de la columna que funciona como factor en la muestra de adiestramiento con el nombre de Adiestramiento
> Column_factor=names(Adiestramiento)[sapply(Adiestramiento, class)==»factor»]
> # Estas funciones realizan el análisis discriminante y evalúan su eficacia testeándola con la muestra de adiestramiento
> lda=lda(as.formula(paste(Column_factor,»~.»,sep=»»)),data=Adiestramiento)
> plot(lda) # Este es el gráfico en el que se observan los grupos
> lda # Aquí salen los coeficientes de la/s función/es discriminate/s
Call:
lda(as.formula(paste(Column_factor, «~.», sep = «»)), data = Adiestramiento)Prior probabilities of groups:
Especie_A Especie_B
0.5974026 0.4025974
Group means:
Pétalos Sépalos Estambres
Especie_A 72.30435 72.71739 175.1957
Especie_B 76.77419 78.25806 189.4839
Coefficients of linear discriminants:
LD1
Pétalos 0.04470876
Sépalos 0.15128542
Estambres 0.05507223
Interpretación de los resultados:
Estos son los coeficientes de la función discriminante (LD1) que nos permitirá diferenciar a las especies. Como sólo tenemos 2 especies, aparece una sola función discriminante. La ecuación resultante de la misma sería la siguiente:
Y = 0.04470876*Pétalos + 0.15128542*Sépalos + 0.05507223*Estambres
> lda$counts # Este es el número total de observaciones por grupo
Especie_A Especie_B
46 31
Interpretación de los resultados:
Estos son el número total de individuos asignados a cada especie en la muestra de adiestramiento.
> lda$svd
[1] 7.853531
> lda.p=predict(lda)
> Tabla=table(Adiestramiento[,Column_factor],lda.p$class)
> Tabla # En FILAS los reales y en COLUMNAS los estimados
Especie_A Especie_B
Especie_A 41 5
Especie_B 8 23
Interpretación de los resultados:
Como resultado de aplicar la función discriminante descrita arriba sobre la muestra de adiestramiento, suponiendo que no conociéramos a qué grupo pertenecían, se observan los fallos y aciertos en la asignación a una especie u otra.
Las filas representan el número real de individuos por especie y en columnas el número estimado de especies después de aplicar la función.
Su lectura se hace del siguiente modo:
– De los 46 individuos reales de la especie A (41+5), 41 se han asignado correctamente a esa especie, mientras que 5 se han asignado erróneamente a la especie B.
– De los 31 individuos reales de la especie B (8+23), 23 se han asignado correctamente a esa especie, mientras que 8 se han asignado erróneamente a la especie A.
> diag(prop.table(Tabla, 1)) # Porcentajes de aciertos por grupo en la muestra de adiestramiento
Especie_A Especie_B
0.8913043 0.7419355
Interpretación de los resultados:
Teniendo en cuenta los aciertos y fallos vistos en la tabla anterior, se determina que ha habido un 89% de aciertos a la hora de averiguar individuos de la especie A y un 74% de aciertos en el caso de la especie B. El total de aciertos se ve a continuación.
> sum(diag(prop.table(Tabla))) # Porcentaje de acierto total en la muestra de adiestramiento
[1] 0.8311688
Interpretación de los resultados:
Uniendo los aciertos de la especie A y B, se observa que nuestra función discriminante ha asignado correctamente a su especie real a un 83% de los individuos.
> # Estas funciones estiman los grupos a los que pertenecerían las observaciones de la muestra experimental recogidas en el conjunto de datos llamados Experimental
> pred=predict(lda,Experimental)$class
> Experimental$Grupo_Estimado=with(Experimental,pred)
> Experimental
Pétalos Sépalos Estambres Grupo_Estimado
1 85 68 270 Especie_B
2 65 65 165 Especie_A
3 55 63 270 Especie_B
4 75 77 180 Especie_A
5 60 70 175 Especie_A
6 65 66 210 Especie_A
7 62 80 245 Especie_B
8 80 60 170 Especie_A
9 65 78 200 Especie_B
10 70 65 220 Especie_B
11 70 65 210 Especie_A
12 63 59 200 Especie_A
13 75 80 190 Especie_B
14 60 75 170 Especie_A
15 65 67 200 Especie_A
16 70 70 190 Especie_A
17 79 70 200 Especie_B
18 56 90 210 Especie_B
19 75 81 210 Especie_B
20 45 66 170 Especie_A
21 70 65 195 Especie_A
Interpretación de los resultados:
Los 21 individuos de la muestra experimental se han asignado a una especie u otra, dependiendo de sus valores.
Ahora bien, teniendo en cuenta que nuestra función discriminante tiene un 83% de aciertos sobre la muestra de adiestramiento (o lo que es lo mismo, un 17% de fallos), podríamos esperar que entre 3 y 4 individuos (el valor real es 3.545 individuos) de la muestra experimental estuviesen erróneamente asignados.
Referencias
En esta ocasión, 2 vídeos de Youtube han sido de ayuda para redactar la entrada actual.
Aunque la siguiente web escrita también ha sido básica:
Estimado, solo puedo descargar el archivo «Experimental» y no el de adiestramiento
Saludos
Hola Tomás, ya está arreglado. Dime si todo funciona correctamente.
Hola, ¿Como hago para interpretar los coeficientes de la función discriminante (LD1) , para saber cual variable me discrimina más entre las dos especies? Es decir, la longitud de sépalos es una buena variable que sirve para discriminar entre las dos especies con respecto a las otras variables. Gracias
Hola Yesely. Cuanto mayor sea en valores absolutos los coeficientes, más importancia tiene ese carácter a la hora de discriminar. En este caso, y como bien dices, los sépalos es la variable que más ayuda a discriminar, con un valor de 0.15.
Hola. Tengo duda con la interpretación de la gráfica, quisiera saber sobre la altura de las barras a que hace referencia.
Hola Jose, se refiere a la densidad.
hola buenos dias, realice mi tesis doctoral utilizando el análisis discriminante para buscar las variables fotométricas que me separaban 3 tipos de genotipos, en mis resultados uno de ellos quedo clasificado con un 69 % de acierto, mis resultados iban enfocados a clasificar y ver cuales de las variables morfométricas eran las que mas los separaban. La estadista no me explico nunca si ese valor seria definitivo o habría que corregirlo, pero tengo duda si ese porcentaje tenga alguna relevancia en el valor de la investigacion. saludos