La projection de Fisher, possible avec la fonction LDA qui fait entres autres des Analyse discriminante linéaire (LDA), on peut réduire le nombre de dimensions d'un jeu de données comme l'ACP mais en maximisant la distance entre les catégories qui doivent donc être connues à l'avance.
#Simulation d'un jeu de données à 3 catégories et 5 variables
# Glycémie
x_a <- rnorm(100,1,0.2);x_b <- rnorm(120,1.1,0.23);x_c <- rnorm(80,1,0.3);x <- c(x_a,x_b,x_c)
# Calcémie
y_a <- runif(100,2.2,2.6) ;y_b <- rnorm(120,2.3,0.5) ;y_c <- rpois(80,22)/10 ;y <- c(y_a,y_b,y_c)
# Protéine C-Réactive 6 mg/L
z_a <- rnorm(40,6,2) ;z_a <- c(z_a,rnorm(40,20,15));z_a <- c(z_a,rnorm(20,3,4));z_b <- rnorm(120,5.5,0.5) ;z_c <- rpois(80,50);z <- abs(c(z_a,z_b,z_c))
# TSH 0.4 à 4 mUI/l
w_a <- rnorm(50,2,1) ;w_a <- c(w_a,rnorm(50,2,1.1));w_a <- sort(w_a);w_b <- sort(abs(rnorm(120,1,2)));w_c <- rev(sort(abs(rnorm(80,2,1))));w <- abs(c(w_a,w_b,w_c))
# HDL 0.4 à 0.5
v_a <- rpois(100,50)/100;v_b <- sort(rpois(120,50)/100);v_c <- sort(rpois(80,50)/100)+0.2;v <- c(v_a,v_b,v_c)
# Catégories
categories<-c(rep("A",100),rep("B",120),rep("C",80))
# Compilation dans un tableau data.frame
compilation <- data.frame(categories,x,y,z,w,v);colnames(compilation) <- c("Catégories","Glycémie","Calcémie","Protéine C-Réactive","TSH","HDL");
head(compilation)
library("MASS")
sang.lda <- lda(Catégories~. ,data=compilation)
D1 <- sang.lda$scaling[,1] # vecteur 1
D2 <- sang.lda$scaling[,2] # vecteur 2
# Calcul de projeté des individus sur D1 et D2
xy <- as.matrix(compilation[,-1])%*%as.matrix(cbind(D1,D2))
color <- categories ;color[color=="A"] <- "black"
color[color=="B"] <- "red";color[color=="C"] <- "green"
plot(xy,col=color,pch=16 )