lunes, 14 de septiembre de 2009

Análisis Discriminante en R

Act 2 Disc Rim in Ante

Act 2 Disc Rim in Ante 3

Aplicaciones-Ejemplos
Aplicaciones-Ejemplos

#Se puede considerar como un análisis de regresión donde la variable dependiente es categórica y tiene como categorías la etiqueta de cada uno de los grupos,
#y las variables independientes son continuas y determinan a qué grupos pertenecen los objetos.

#OBJETIVOS:
#1)Se pretende encontrar relaciones lineales entre las variables continuas que mejor discriminen en los grupos dados a los objetos.
#2)Construir una regla de decisión que asigne un objeto nuevo, que no sabemos clasificar previamente, a uno de los grupos prefijados con un cierto grado de riesgo.
# 1. Determinar si existen diferencias significativas entre los “perfiles” de un conjunto de variables de dos o m´as grupos definidos a priori.
# 2. Determinar cual de las variables independientes cuantifica mejor las diferencias entre un grupo u otro.
# 3. Establecer un procedimiento para clasificar a un individuo en base a los valores de un conjunto de variables independientes
#Es necesario considerar una serie de restricciones o supuestos
#La discriminaci´on se lleva a cabo estableciendo las ponderaciones del valor te´orico de cada variable, de tal forma que maximicen la varianza entre-grupos frente a la intra-grupos.


##################################################################
# Se carga la librería MASS
library(MASS)
> datos<-read.table("discriminante.txt", header=TRUE)

#Existen 2 clasificadores: el clasificador lineal de Fisher y el clasificador “no param´etrico” k-NN
#el clasificador lineal tiende a quedar consistentemente por encima del k-NN en estas condiciones ideales (Caso normal homoced´astico).

#############I) An´alisis discriminante lineal de Fisher: "lda" se hace un análisis discriminante lineal
> attach(datos)
> discrimi<-lda(discriminante~X1+X2+X3+X4+X5+X6+X7+X8+X9+X10+X11+X12+X13,prior=c(0.33,0.33,0.34), method="moment", tol=0.001)
#Probabilidades previas: Estos valores se utilizan para la clasificaci´on. Se puede elegir entre:
#1. Todos los grupos iguales: las probabilidades previas ser´an iguales para todos los grupos.
#2. Calcular seg´un tama˜nos de grupos
#En este caso consideramos que las probabilidades de pertenencia a cada grupo son iguales. Si quisiéramos que las probabilidades sean proporcionales al tamaño, no indicaríamos nada.

#Del mismo modo usaremos el m´etodo de los momentos

#Salidas:
#Prior probabilities of groups: tabla con las probabilidades de permanencia a cada grupo.
#Group means: las medias por grupo; con esta opci´on, tenemos que analizar, que para cada variable,
#efectivamente, hay diferencias significativas entre los valores de los tres grupos (se puede realizar
#un an´alisis de la varianza, y utilizar el mismo razonamiento que en la parte de SPSS).
#Coefficients of linear discriminants:
#los coeficientes de la funci´on discriminante lineal de Fisher se extraen mediante
> discrimi$scaling
#Esto significa que la puntuaci´on discriminante de cada caso se obtiene con la fórmula:
y = a1 x1 +a2 x2 +a3 x3 + a4 x4 + a5 x5...
#Las puntuaciones discriminantes por grupos se pueden representar gr´aficamente mediante el comando:
> plot(discrimi) #Las puntuaciones se han trasladado de forma que la media global es igual a cero.
#En muchos casos las puntuaciones van a separar correctamente los datos.
#Hay una zona en la que las dos poblaciones se solapan. Esta es la zona que incrementará el valor de las tasas de error.
#Proportion of trace: proporci´on de varianza explicada por cada eje (el primer eje ser´a mucho m´as discriminante que el segundo).
#Con la orden svd obtendremos el poder discriminate de cada funci´on, es decir, que la primera es mucho m´as discriminante que la segunda.
> discrimi$svd

#Para clasificar las observaciones se utiliza la sentencia siguiente:
> predclas <- predict(discrimi)$class
#Estudio de los errores
#Para analizarlos se suele utilizar la representaci´on gr´afica de las observaciones,representando las puntuaciones Z discriminantes y buscando los casos mal representados para su estudio.
#La tasa de error aparente se calcula de la siguiente forma:
> tea <- 1 - sum(predclas == datos[,length(datos)])/n #n es el número de casos
#Para calcular la tasa de error por validaci´on cruzada se utiliza la opci´on CV=T al llamar a la funci´on lda:
> predclas.cv <- lda(datos[,-length(datos)],datos[,length(datos)],CV=T)$class #datos[,length(datos)] refiere a la columna de categorías o clases
#CV=TRUE generates jacknifed (i.e., leave one out) predictions.
> tevc <- 1 - sum(predclas.cv == datos[,length(datos)])/n #n es el número de casos

#Validación de los resultados: Tambi´en podemos crear la matriz de clasificaci´on sin m´as que utilizar la siguiente orden:
> table(predict(discrimi)$class, discriminante) #discriminante: columna de categorías o clases de la matriz Datos
#discriminante: permite observar los individuos mal clasificados, ver toda la matriz exc la diagonal

#Realizar una predicción sobre un par de individuos. Por ejemplo:
> Datos2<-rbind(c(5.6,4.2,15.8, 1.7,0.17,1.6,2.3,6.0,4.0,5.27,0.14,216.25,26.66),c(5.45, 3.09,17.82,1.56,0.14,1.62,1.97,5.21,2.68,7.45,0.15,285.71,23.42))
> Datos21<-data.frame(Datos2) #Antes: colnames(Datos2)<-colnames(Datos[,-length(Datos)])
> discrimi2<-predict(discrimi,newdata=Datos21,prior=discrimi$prior,2)
#Obteniendo las siguientes salidas:
#discrimi2$class
#discrimi2$posterior: las probabilidades de que el individuo seleccionado (row) pertenezca a cada grupo (col)
#discrimi2$x
#Otra forma
predict(discrimi,newdata=Datos21)$class ##predice el grupo de pertenencia de los nuevos datos
> grupo <- predict(discrimi,method="plug-in")$class ##Se predicen los datos originales en los grupos segun la function discriminante
> table(grupo,Type) ##Se observa el numero de datos originales bien y mal clasificados


#Representación gráfica:
> plot(discrimi)
> pairs(discrimi) #produce los pares de gr´aficos de los datos frente a las puntuaciones discriminantes
#histogramas de las variables dependientes frente a la variable de grupos.
#En este caso habr´ýa que hacer todas las variables X1,X2, . . . ,X13 frente a la variable discriminante.
#existe un comportamiento muy diferente de la variable dependiendo del grupo al que pertenece.
##Con el fin de identificar las principales caracter´ýsticas de los datos, podemos representar la matriz de diagramas de dispersi´on:
# Panels of histograms and overlayed density plots, for 1st discriminant function
> plot(discrimi, dimen=1, type="both")
## Exploratory Graph for LDA
> library(klaR)
> partimat(formula,data=datos,method="lda") #formula: discriminante~X1+X2+X3+X4+X5+X6+X7+X8+X9+X10+X11+X12+X13
##You can also produce a scatterplot matrix with color coding by group.Ej. Scatterplot for 3 Group Problem
> pairs(mydata[c("x1","x2","x3")], main="My Title ", pch=22, bg=c("red", "yellow", "blue")[unclass(mydata$G)])

###############II) El m´etodo de k vecinos m´as pr´oximos

###############III) Comparaci´on de los resultados