logo

Introducción

El Análisis Discriminante (AD), introducido por Fisher (1936), es una técnica que se utiliza para predecir la pertenencia a un grupo (variable dependiente) a partir de un conjunto de predictores (variables independientes). El objetivo del AD es entender las diferencias de los grupos y predecir la verosimilitud de que una persona o un objeto pertenezca a una clase o grupo basándose en los valores que toma en los predictores.

Existen dos enfoques en la clasificación discriminante:

  • El basado en la obtención de funciones discriminantes de cálculo similar a las ecuaciones de regresión lineal múltiple.

  • Empleando técnicas de correlación canónica y de componentes principales, denominado análisis discriminante canónico.

El primer enfoque es el más común y es el que abordamos en esta clase. Su fundamento matemático está en conseguir, a partir de las variables explicativas, unas funciones lineales de éstas con capacidad para clasificar a otros individuos, donde la función de mayor valor define el grupo a que pertenece de forma más probable.

El AD solo admite variables cuantitativas como regresores, por lo que si alguna de las variables independientes es categórica, hay que utilizar otros métodos alternativos de clasificación.

Algoritmo

Supongamos que tenemos un conjunto de entrenamiento \((x_i,c_j)\), donde \(i=1,2,\dots,n\) y las etiquetas \(j =1,2,\dots,g\). El propósito del AD consiste en aprovechar la información contenida en las variables independientes para crear una función \(Z\) combinación lineal de las \(p\) variables explicativas, capaz de diferenciar lo más posible a los grupos. La combinación lineal para el análisis discriminante, función discriminante de Fisher, se formula:

\[ z_i = \beta_0 + \beta_1 x_{1i} + \beta_2 x_{2i}+\dots,\beta_p x_{pi}\]

donde,

  • \(z_i\) es la puntuación \(Z\) discriminante para el objeto \(i\).

  • \(\beta_0\) es el término constante.

  • \(\beta_j\) es la ponderación discriminante para la variable independiente \(j\).

  • \(x_{ji}\) es la variable independiente \(j\) para el objeto \(i\).

Una vez hallada la función discriminante, el resultado es una única puntuación \(z_i\) discriminante compuesta para cada individuo en el análisis. Promediando las puntuaciones discriminantes para todos los individuos dentro de un grupo particular, obtenemos la media del grupo. Esta media es conocida como centroide.

La función \(Z\) debe ser tal que la distancia entre los centroides sea máxima, consiguiendo de esta forma que los grupos estén lo más distantes posible. Podemos expresar esta distancia de la siguiente manera:

\[ h = z_{1} - z_2\]

La mayor utilidad de una función discriminante radica en su capacidad para clasificar nuevos casos. Ahora bien, la clasificación de casos es algo muy distinto de la estimación de la función discriminante. De hecho, una función perfectamente estimada puede tener una pobre capacidad clasificatoria.

Una manera de clasificar los casos consiste en calcular la distancia existente entre los centroides de ambos grupos y situar un punto de corte discriminante: \[ z_0 = \dfrac{z_1+z_2}{2}\] equidistante de ambos centroides. A partir de esto, los casos cuyas puntuaciones discriminantes sean mayores que el punto de corte \(z_0\), serán asignados al grupo superior, y los casos cuyas puntuaciones sean menores que el punto de corte
\(z_0\), serán asignados al grupo inferior.

En R se usa la función lda() .

Ejemplos en R

Ejemplo 1:

Para este ejemplo, trabajaremos con el conjunto de datos iris.

Mediante un muestreo aleatorio, separamos el conjunto de entrenamiento y en cojunto de prueba. Supongamos en 5 grupos, 4 para entrenamiento y 1 para prueba.

data    <- iris
N       <- nrow(data)
n       <- round(N*0.80)
set.seed(1234)
indices       <- sample(1:N,n)
entrenamiento <- data[indices,]
prueba        <- data[-indices,]

Construimos el modelo ajustado con los datos de entrenamiento.

library(MASS)
AD1 <- lda(Species~. , data=entrenamiento)

Calculamos la predición para los datos de entrenamiento.

pred<- predict(AD1,entrenamiento[,-5])
tt<- table(pred$class,entrenamiento[,5])
tt
##             
##              setosa versicolor virginica
##   setosa         37          0         0
##   versicolor      0         40         1
##   virginica       0          2        40
TA <- (sum(diag(tt)))/sum(tt) # tasa de aciertos
round(TA,2)
## [1] 0.98

Para analizar la calidad del modelo, veamos que tan buena es la predicción para el conjunto de prueba.

Pred1    <- predict(AD1, prueba[,-5])
table    <- table(prueba[,5],Pred1$class)
table
##             
##              setosa versicolor virginica
##   setosa         13          0         0
##   versicolor      0          8         0
##   virginica       0          0         9
(sum(diag(table)))/sum(table)
## [1] 1

Ejemplo 2:

Para este segundo ejercicio usaremos la base de datos Aid2 de R, que contiene datos sobre pacientes con sida.

library(MASS)
data <- Aids2
str(data)
## 'data.frame':    2843 obs. of  7 variables:
##  $ state  : Factor w/ 4 levels "NSW","Other",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ sex    : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 2 2 2 ...
##  $ diag   : int  10905 11029 9551 9577 10015 9971 10746 10042 10464 10439 ...
##  $ death  : int  11081 11096 9983 9654 10290 10344 11135 11069 10956 10873 ...
##  $ status : Factor w/ 2 levels "A","D": 2 2 2 2 2 2 2 2 2 2 ...
##  $ T.categ: Factor w/ 8 levels "hs","hsid","id",..: 1 1 1 5 1 1 8 1 1 2 ...
##  $ age    : int  35 53 42 44 39 36 36 31 26 27 ...

Mediante un muestreo aleatorio, separamos el conjunto de entrenamiento y en cojunto de prueba. Supongamos en 5 grupos, 4 para entrenamiento y 1 para prueba.

N       <- nrow(data)
n       <- round(N*0.80)
set.seed(2023)
indices       <- sample(1:N,n)
entrenamiento <- data[indices,]
prueba        <- data[-indices,]

Construimos el modelo ajustado con los datos de entrenamiento.

AD2 <-lda(status~diag+age,data=entrenamiento)

Podemos calcular la predición para los datos de entrenamiento.

#predicción
pred <- predict(AD2,entrenamiento[,c(3,7)])
tt   <- table(pred$class,entrenamiento[,5])
tt
##    
##        A    D
##   A  640  265
##   D  230 1139
TA <- (sum(diag(tt)))/sum(tt) # tasa de aciertos
round(TA,2)
## [1] 0.78

Para analizar la calidad del modelo, veamos que tan buena es la predicción para el conjunto de prueba.

Pred1    <- predict(AD2, prueba[,c(3,7)],type="prob")
table    <- table(prueba[,5],Pred1$class)
table
##    
##       A   D
##   A 154  58
##   D  68 289
round((sum(diag(table)))/sum(table),2)
## [1] 0.78