Realizar un análisis discriminante en R de un modo fácil con la función lda

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

  1. 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.
  2. 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.

Ejemplo
Supongamos que tenemos un conjunto de 77 flores que sabemos que pertenecen a dos especies (Especie A y Especie B) (éstas conforman la muestra de adiestramiento). Sobre cada una de ellas medimos tres variables que consideramos que son útiles para poder diferenciarlas (Longitud de los Pétalos, Longitud de los Sépalos, Número de Estambres). Por otro lado, tenemos otras 21 flores de las que no sabemos a qué especie podrían pertenecer, pero de las que tenemos sus medidas (éstas conforman la muestra experimental). Nos hacemos las siguientes preguntas:

  1. Respecto a la muestra de adiestramiento (77 flores):
    1. ¿Cuál es la función discriminante que nos permite diferenciar las dos especies usando las tres variables medidas?
    2. 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?
  2. Respecto a la muestra experimental (21 flores):
    1. ¿Cuántas pertenecerían a la Especie A?
    2. ¿Cuántas pertenecerían a la Especie B?
    3. ¿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:

Cargamos las tablas en R Commander

Pantallazo-R Commander
Datos – Importar datos – desde archivo de texto, portapapeles o URL…

Importamos ahora cada tabla por separado dándolas el nombre de Adiestramiento y Experimental, respectivamente, como se ve a continuación:

Tabla Adiestramiento y Experimental

Vemos los datos a continuación presionando sobre Visualizar conjunto de datos:

Datos adiestramiento y experimental

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.

Cargar paquetes
Herramientas – Cargar paquete(s)…
Cargar librería MASS
Buscamos y presionamos sobre librería MASS y damos a Aceptar.

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 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
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:

Realizar un análisis discriminante en R de un modo fácil con la función lda

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:

Pantallazo-Ventana sin título
Distribución de cada grupo a lo largo del eje discriminante.

 

Interpretación de los resultados

> # 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:

9 comentarios en «Realizar un análisis discriminante en R de un modo fácil con la función lda»

  1. 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

    Responder
    • 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.

      Responder
  2. 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

    Responder

Deja un comentario