18 de diciembre de 2017

Análisis discriminante

Análisis de funciones discriminatorias ( DA ) se refiere al proceso de determinar qué variables independientes (predictoras) continuas discriminan entre las categorías de una variable dependiente (respuesta) discreta, que puede considerarse como una inversión Análisis multivariado de la varianza ( MANOVA ).

Esto sugiere que DA es muy similar a la regresión logística, Más allá de la línea de tendencia lineal, que se utiliza de manera más general debido a su flexibilidad. Mientras que la regresión logística puede manejar tanto datos categóricos como continuos, DA requiere variables numéricas independientes y tiene algunos requisitos adicionales que la regresión logística no tiene:

  • Se asume la distribución normal

  • Los valores atípicos deben ser eliminados

  • No hay dos variables deben estar altamente correlacionadas (multicolinealidad)

  • El tamaño de muestra de la categoría más pequeña debe ser mayor que el número de valores de predicción

  • El número de variables independientes no debe exceder el tamaño de muestra

Esta técnica se utiliza para estudiar diferencias entre grupos de elementos de la muestra que ya están creados, determinando aquellas variables que explican mejor el hecho de que un elemento de la muestra pertenezca a un grupo determinado.

Tipos de DA

  • Función discriminante lineal

  • Función discriminamte cuadrática

Ejemplo con Rstudio

Caso de Estudio

Para el siguiente estudio tomaremos el DataSet wine. Estos datos son el resultado de un análisis químico de vinos cultivados en la misma región en Italia pero derivados de tres cultivares diferentes. El análisis determinó las cantidades de 13 componentes encontrados en cada uno de los tres tipos de vinos.

Variables
Alcohol
Ácido málico
Cenizas
Alcalinidad de cenizas
Magnesio
Fenoles totales
Flavonoides
Fenoles no flavonoides
Proantocianinas
Intensidad del color

Variables
Hue
OD280 / OD315 de los vinos diluidos
Prolina

Ejemplo

Cargamos los paquetes

library(lda)
## Warning: package 'lda' was built under R version 3.4.3
library(MASS)
library(car)
library(rattle.data)
## Warning: package 'rattle.data' was built under R version 3.4.3

Cargamos el conjunto de datos mtcars

data("wine")
  Type Alcohol Malic  Ash Alcalinity Magnesium Phenols Flavanoids
1    1   14.23  1.71 2.43       15.6       127    2.80       3.06
2    1   13.20  1.78 2.14       11.2       100    2.65       2.76
3    1   13.16  2.36 2.67       18.6       101    2.80       3.24
4    1   14.37  1.95 2.50       16.8       113    3.85       3.49
5    1   13.24  2.59 2.87       21.0       118    2.80       2.69
6    1   14.20  1.76 2.45       15.2       112    3.27       3.39
  Nonflavanoids Proanthocyanins Color  Hue Dilution Proline
1          0.28            2.29  5.64 1.04     3.92    1065
2          0.26            1.28  4.38 1.05     3.40    1050
3          0.30            2.81  5.68 1.03     3.17    1185
4          0.24            2.18  7.80 0.86     3.45    1480
5          0.39            1.82  4.32 1.04     2.93     735
6          0.34            1.97  6.75 1.05     2.85    1450

Viendo la estructura de los datos

str(wine)
'data.frame':   178 obs. of  14 variables:
 $ Type           : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
 $ Alcohol        : num  14.2 13.2 13.2 14.4 13.2 ...
 $ Malic          : num  1.71 1.78 2.36 1.95 2.59 1.76 1.87 2.15 1.64 1.35 ...
 $ Ash            : num  2.43 2.14 2.67 2.5 2.87 2.45 2.45 2.61 2.17 2.27 ...
 $ Alcalinity     : num  15.6 11.2 18.6 16.8 21 15.2 14.6 17.6 14 16 ...
 $ Magnesium      : int  127 100 101 113 118 112 96 121 97 98 ...
 $ Phenols        : num  2.8 2.65 2.8 3.85 2.8 3.27 2.5 2.6 2.8 2.98 ...
 $ Flavanoids     : num  3.06 2.76 3.24 3.49 2.69 3.39 2.52 2.51 2.98 3.15 ...
 $ Nonflavanoids  : num  0.28 0.26 0.3 0.24 0.39 0.34 0.3 0.31 0.29 0.22 ...
 $ Proanthocyanins: num  2.29 1.28 2.81 2.18 1.82 1.97 1.98 1.25 1.98 1.85 ...
 $ Color          : num  5.64 4.38 5.68 7.8 4.32 6.75 5.25 5.05 5.2 7.22 ...
 $ Hue            : num  1.04 1.05 1.03 0.86 1.04 1.05 1.02 1.06 1.08 1.01 ...
 $ Dilution       : num  3.92 3.4 3.17 3.45 2.93 2.85 3.58 3.58 2.85 3.55 ...
 $ Proline        : int  1065 1050 1185 1480 735 1450 1290 1295 1045 1045 ...

Comencemos con la variable dependiente siendo el tipo, y usaremos todos los otros valores numéricos como variables independientes.

Verificación de datos perdidos

#Para ver las variables con valores perdidos
which(colSums(is.na(wine))!=0)
## named integer(0)
#Para ver que filas tienen valores perdidos
rmiss=which(rowSums(is.na(wine))!=0,arr.ind=T)
rmiss
## integer(0)

scatterplotMatrix(wine[2:6])

library(MVN)
outlier <- mvOutlier(wine[,-1], qqplot = TRUE, method = "quan")

roystonTest(data = wine[,-1], qqplot = TRUE)

##   Royston's Multivariate Normality Test 
## --------------------------------------------- 
##   data : wine[, -1] 
## 
##   H       : 182.5371 
##   p-value : 7.306913e-33 
## 
##   Result  : Data are not multivariate normal. 
## ---------------------------------------------

El propósito del análisis discriminante lineal (LDA) en este ejemplo es encontrar las combinaciones lineales de las variables originales (las 13 concentraciones químicas) que proporcionan la mejor separación posible entre los grupos (variedades de vino) en nuestro conjunto de datos. El análisis discriminante lineal también se conoce como "análisis discriminante canónico", o simplemente "análisis discriminante".

Si queremos separar los vinos por cultivar, los vinos provienen de tres cultivares diferentes, por lo que el número de grupos G = 3 y el número de variables es 13 (13 concentraciones de sustancias químicas, p = 13). El número máximo de funciones discriminantes útiles que pueden separar los vinos por cultivar es el mínimo de G-1G-1 y pp, por lo que en este caso es el mínimo de 2 y 13, que es 2. Por lo tanto, podemos encontrar en la mayoría de las 2 funciones discriminantes útiles para separar los vinos por cultivar, utilizando las 13 variables de concentración química.

wine_lda <- lda(Type ~ ., data = wine)
wine_lda
## Call:
## lda(Type ~ ., data = wine)
## 
## Prior probabilities of groups:
##         1         2         3 
## 0.3314607 0.3988764 0.2696629 
## 
## Group means:
##    Alcohol    Malic      Ash Alcalinity Magnesium  Phenols Flavanoids
## 1 13.74475 2.010678 2.455593   17.03729  106.3390 2.840169  2.9823729
## 2 12.27873 1.932676 2.244789   20.23803   94.5493 2.258873  2.0808451
## 3 13.15375 3.333750 2.437083   21.41667   99.3125 1.678750  0.7814583
##   Nonflavanoids Proanthocyanins    Color       Hue Dilution   Proline
## 1      0.290000        1.899322 5.528305 1.0620339 3.157797 1115.7119
## 2      0.363662        1.630282 3.086620 1.0562817 2.785352  519.5070
## 3      0.447500        1.153542 7.396250 0.6827083 1.683542  629.8958
## 
## Coefficients of linear discriminants:
##                          LD1           LD2
## Alcohol         -0.403399781  0.8717930699
## Malic            0.165254596  0.3053797325
## Ash             -0.369075256  2.3458497486
## Alcalinity       0.154797889 -0.1463807654
## Magnesium       -0.002163496 -0.0004627565
## Phenols          0.618052068 -0.0322128171
## Flavanoids      -1.661191235 -0.4919980543
## Nonflavanoids   -1.495818440 -1.6309537953
## Proanthocyanins  0.134092628 -0.3070875776
## Color            0.355055710  0.2532306865
## Hue             -0.818036073 -1.5156344987
## Dilution        -1.157559376  0.0511839665
## Proline         -0.002691206  0.0028529846
## 
## Proportion of trace:
##    LD1    LD2 
## 0.6875 0.3125

Esto significa que la primera función discriminante es una combinación lineal de las variables: -0.403 * Alcohol + 0.165 * Málico - 0.003 * Prolina. Por conveniencia, el valor de cada función discriminante (por ejemplo, la primera función discriminante) se escala de modo que su valor medio sea cero y su varianza sea uno.

Una buena forma de mostrar los resultados de un análisis discriminante lineal (LDA) es hacer un histograma apilado de los valores de la función discriminante para las muestras de diferentes grupos (diferentes variedades de vino en nuestro ejemplo).

plot(wine_lda, dimen = 1, type = "both")

plot(wine_lda, col = c("red", "blue", "green"))

predicciones <- predict(object = wine_lda, newdata = wine[, -1],
                        method = "predictive")
table(wine$Type, predicciones$class,
      dnn = c("Clase real", "Clase predicha"))
##           Clase predicha
## Clase real  1  2  3
##          1 59  0  0
##          2  0 71  0
##          3  0  0 48

trainig_error <- mean(wine$Type != predicciones$class) * 100
paste("trainig_error =", trainig_error, "%")
## [1] "trainig_error = 0 %"

Empleando las mismas observaciones con las que se ha generado el modelo discriminante (trainig data), la precisión de clasificación es del 100%. Evaluar un modelo con los mismos datos con los que se ha creado suele resultar en estimaciones de la precisión demasiado optimistas (training error muy bajo). La estimación del test error mediante validación cruzada es más adecuada para obtener una evaluación realista del modelo.