#************************************************ #************************************************ #Ejemplo1: Analisis discriminante Lineal #Usa la funcion lda de la libreria MASS de Ripley #************************************************ library(MASS) #Leyendo los datos del ejemplo 1 de la internet eje1dis=read.table("http://math.uprm.edu/~edgar/eje1disc.dat",header=T) #eje1dis=read.table("c://eje1disc.dat") eje1dis #Separando el conjunto de datos en dos grupos pasan=eje1dis[eje1dis[,4]=="p",] npasan=dim(pasan)[1] fracasan=eje1dis[eje1dis[,4]=="f",] nfracasan=dim(fracasan)[1] #Hallando las medias de E1 y E2 en ambos grupos medp<-mean(pasan[,1:2]) medp medf<-mean(fracasan[,1:2]) medf #Ploteando los puntos y los centroides de cada grupo win.graph() plot(fracasan$E1,fracasan$E2,xlim=c(0,100),ylim=c(0,100),type="n") text(fracasan$E1,fracasan$E2,"f", col="red") points(pasan$E1,pasan$E2,type="n") text(pasan$E1,pasan$E2,"p",col="blue") points(medp[1],medp[2], col="dark blue") points(medf[1],medf[2],col="dark red") text(medp[1],medp[2],"centroide pasan") text(medf[1],medf[2],"centroide fracasan") #Calculando la distancia euclideana (al cuadrado) del punto (50,75) a medp observ<-c(50,75) distp<-sum((observ-medp)^2) distp #Calculando la distancia euclideana (al cuadrado) del punto (50,75) a medf distf<-sum((observ-medf)^2) distf #Hallando las matrices de covarianzas en ambos grupos cov1<-cov(pasan[,1:2]) cov1 cov2<-cov(fracasan[,1:2]) cov2 #Calculando la distancia mahalanobis (al cuadrado) del punto (50,75) a medp distmp<-(observ-medp)%*%solve(cov1)%*%(observ-medp) distmp #Calculando la distancia mahalanobis (al cuadrado) del punto (50,75) a medf distmf<-(observ-medf)%*%solve(cov2)%*%(observ+medf) distmf #Calculando los coeficientes de la funcion discriminante covcomb=((npasan-1)*cov1+(nfracasan-1)*cov2)/(npasan+nfracasan-2) coeflda<-(medp-medf)%*%solve(covcomb) coeflda #Calculando el termino independiente indlda<-0.5*(medp-medf)%*%solve(covcomb)%*%(medp+medf) indlda #Trazando la linea del clasificador lineal sobre el plot de puntos win.graph() plot(fracasan$E1,fracasan$E2,xlim=c(0,100),ylim=c(0,100),type="n") text(fracasan$E1,fracasan$E2,"f", col="red") points(pasan$E1,pasan$E2,type="n") text(pasan$E1,pasan$E2,"p",col="blue") points(medp[1],medp[2], col="dark blue") points(medf[1],medf[2],col="dark red") # Ploteando la linea discriminante en la forma pendiente-intercepto abline(indlda/coeflda[2],-coeflda[1]/coeflda[2]) lda1<-lda(Nota~E1+E2,eje1dis) # Con prior ponderadas, como deberia ser lda1 plda1=predict(lda1,eje1dis[,-c(3,4)])$class error1=sum(plda1!=eje1dis[,4]) error1 # Con prior iguales a lo MINITAB lda2<-lda(Nota~E1+E2,eje1dis,prior=c(.5,.5)) lda2 plda2=predict(lda2,eje1dis[,-c(3,4)])$class error2=sum(plda2!=eje1dis[,4]) error2