After completing the linear discriminant analysis in R using lda() there a convenient way to extract the classification functions for each group?
From the link
This should not be confused with discriminant functions. Classification functions can be used to determine which group most likely is the most likely case. There are as many classification functions as there are groups. Each function allows us to calculate classification points for each case for each group, using the formula:
Si = ci + wi1*x1 + wi2*x2 + ... + wim*xm
In this formula, the index i denotes the corresponding group; indices 1, 2, ..., m denote m variables; ci is the constant for the i-th group, wij is the weight for the j-th variable when calculating the classification score for the i-th group; xj is the observed value for the corresponding case for the jth variable. Si is the final classification score.
We can use classification functions to directly compute classification estimates for some new observations.
I can build them from scratch using the tutorial formulas, but for this I need to rebuild a number of intermediate steps from lda analysis. Is there any way to get them after the fact from the lda object?
Added:
If I still do not understand something in Brandon's answer (sorry for the confusion!), It seems that the answer is no. Presumably, most users can get the necessary information from predict() , which provides classifications based on lda() .
For learning-related reasons, more than a serious research need, I really wanted to see the actual classification functions, and for posterity there is a function that adds them to the lda() result:
ty.lda <- function(x, groups){ x.lda <- lda(groups ~ ., as.data.frame(x)) gr <- length(unique(groups)) ## groups might be factors or numeric v <- ncol(x) ## variables m <- x.lda$means ## group means w <- array(NA, dim = c(v, v, gr)) for(i in 1:gr){ tmp <- scale(subset(x, groups == unique(groups)[i]), scale = FALSE) w[,,i] <- t(tmp) %*% tmp } W <- w[,,1] for(i in 2:gr) W <- W + w[,,i] V <- W/(nrow(x) - gr) iV <- solve(V) class.funs <- matrix(NA, nrow = v + 1, ncol = gr) colnames(class.funs) <- paste("group", 1:gr, sep=".") rownames(class.funs) <- c("constant", paste("var", 1:v, sep = ".")) for(i in 1:gr) { class.funs[1, i] <- -0.5 * t(m[i,]) %*% iV %*% (m[i,]) class.funs[2:(v+1) ,i] <- iV %*% (m[i,]) } x.lda$class.funs <- class.funs return(x.lda) }
This code follows the formulas in Legendre and Legendre Numerical Ecology (1998), page 625, and corresponds to the results of the processed example, starting on page 626.