discriminante.lineal <- function (X, tipo, nuevo)
{
p <- ncol(X) Ni <- table (tipo) library (Matrix) D <- as.matrix (bdiag (lapply (Ni, function (ni) matrix (1/ni, ni, ni))))
n <- sum (Ni) Jn <- matrix(1,n,n)/n I <- diag(rep(1,n)) H <- I - Jn T <- t(X) %*% H %*% X B <- t(X) %*% (D - Jn) %*% X W <- t(X) %*% (I - D) %*% X bloques <- lapply (Ni, function (ni) matrix(1/ni,1,ni))
Dbis <- as.matrix (bdiag (bloques))
dimnames (Dbis) [[1]] <- names (bloques)
Med <- Dbis %*% X S <- W / n A <- 2 * solve(S) %*% t(Med)
C <- diag (Med %*% solve(S) %*% t(Med))
V <- nuevo %*% A - C
asigna.indice <- which.max(V)
asigna.nombre <- dimnames (V) [[2]] [asigna.indice]
asigna.nombre
}
discriminante.factor <- function (X, tipo, nuevo)
{
p <- ncol(X) Ni <- table (tipo) library (Matrix) D <- as.matrix (bdiag (lapply (Ni, function (ni) matrix (1/ni, ni, ni))))
n <- sum (Ni) Jn <- matrix(1,n,n)/n I <- diag(rep(1,n)) H <- I - Jn T <- t(X) %*% H %*% X B <- t(X) %*% (D - Jn) %*% X W <- t(X) %*% (I - D) %*% X autoW <- eigen (W)
invW12 <- autoW$vectors %*% diag (1 / sqrt (autoW$values)) %*% t(autoW$vectors)
auto <- eigen (invW12 %*% B %*% invW12)
V <- auto$vectors
landa <- auto$values
varexp <- landa / sum(landa)
U <- invW12 %*% V F <- X %*% U bloques<- lapply (Ni, function (ni) matrix(1/ni,1,ni))
Dbis <- as.matrix (bdiag (bloques))
dimnames (Dbis) [[1]] <- names (bloques)
MedF <- Dbis %*% F Fnuevo <- nuevo %*% U
Dist <- sapply (levels (tipo), function (t) sum ((Fnuevo-MedF[t,])^2))
asigna.indice.F <- which.min (Dist)
asigna.nombre.F <- names (asigna.indice.F)
asigna.nombre.F
}
library (datasets) X <- as.matrix(iris[,-5]) tipo <- iris[,5]
mean (sapply (1:nrow(X),
function (i)
{
Xi <- X[-i,]
tipoi <- tipo[-i]
tipo[i] == discriminante.lineal (Xi, tipoi, X[i,])
}))
mean (sapply (1:nrow(X),
function (i)
{
Xi <- X[-i,]
tipoi <- tipo[-i]
tipo[i] == discriminante.factor (Xi, tipoi, X[i,])
}))