Statistical model reference
Discriminant Analysis
Review when to use this method, its data requirements, implementation patterns, and interpretation guidance.
Description
A classification method that finds the combination of features that best separates different classes. It creates discriminant functions that maximize the differences between predefined groups while minimizing within-group variance, making it effective for classification tasks, feature selection, understanding group differences, and dimension reduction while preserving class separability.
Use Cases
- classification
- feature selection
- dimensionality reduction
- group separation analysis
Requirements
- Sample Size: small, medium, large
- Missing Data: none, random
- Data Distribution: multivariate normal
- Relationship Type: linear, quadratic
Variable Types
Dependent Variables
- categorical
Independent Variables
- continuous
Implementation
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis, QuadraticDiscriminantAnalysis
from sklearn.metrics import classification_report
# Linear Discriminant Analysis
lda = LinearDiscriminantAnalysis()
lda.fit(X_train, y_train)
y_pred = lda.predict(X_test)
print(classification_report(y_test, y_pred))
# Quadratic Discriminant Analysis
qda = QuadraticDiscriminantAnalysis()
qda.fit(X_train, y_train)
qda_pred = qda.predict(X_test)
Documentation
library(MASS)
library(caret)
# Linear Discriminant Analysis
lda_model <- lda(Class ~ ., data=train_data)
predictions <- predict(lda_model, test_data)
# Confusion matrix
confusionMatrix(predictions$class, test_data$Class)
# Quadratic Discriminant Analysis
qda_model <- qda(Class ~ ., data=train_data)
qda_predictions <- predict(qda_model, test_data)
Documentation
DISCRIMINANT
/GROUPS=Class(1 3)
/VARIABLES=Var1 Var2 Var3
/ANALYSIS ALL
/PRIORS EQUAL
/STATISTICS=MEAN STDDEV UNIVF BOXM COEFF RAW TABLE CROSSVALID
/CLASSIFY=NONMISSING POOLED
Documentation
proc discrim data=train pool=test crossvalidate;
class Class;
var Var1-Var3;
priors proportional;
run;
* Quadratic Discriminant Analysis;
proc discrim data=train pool=no crossvalidate;
class Class;
var Var1-Var3;
run;
Documentation
// Linear Discriminant Analysis
discrim lda Var1 Var2 Var3, group(Class) notable
// Quadratic Discriminant Analysis
discrim qda Var1 Var2 Var3, group(Class) notable
// Classification table
estat classtable
Documentation
Synthetic Data Example
A multivariate dataset with three classes suitable for discriminant analysis
R Code for Data Generation and Analysis
# Generate synthetic data for Discriminant Analysis
library(MASS)
set.seed(123)
# Parameters for three classes
mu1 <- c(1, 1)
mu2 <- c(5, 3)
mu3 <- c(3, 5)
sigma <- matrix(c(1, 0.5, 0.5, 1), nrow=2)
# Generate data for each class
g1 <- mvrnorm(n=50, mu=mu1, Sigma=sigma)
g2 <- mvrnorm(n=50, mu=mu2, Sigma=sigma)
g3 <- mvrnorm(n=50, mu=mu3, Sigma=sigma)
# Combine into data frame
df <- data.frame(
rbind(g1, g2, g3),
Class = factor(rep(c("A", "B", "C"), each=50))
colnames(df)[1:2] <- c("X1", "X2")
# Visualize the data
library(ggplot2)
ggplot(df, aes(X1, X2, color=Class)) +
geom_point(size=3) +
stat_ellipse(level=0.95) +
ggtitle("Synthetic Data for Discriminant Analysis")
# Split into training and test sets
train_idx <- sample(1:nrow(df), size=0.7*nrow(df))
train_data <- df[train_idx, ]
test_data <- df[-train_idx, ]
# Perform LDA
library(MASS)
lda_model <- lda(Class ~ X1 + X2, data=train_data)
lda_pred <- predict(lda_model, test_data)
# Confusion matrix
table(Predicted=lda_pred$class, Actual=test_data$Class)
# Posterior probabilities
head(lda_pred$posterior)
Copy this code into your R environment to generate synthetic data and perform analysis with this model.
Expected Analysis Results
Console Output
> # LDA Model Summary
> lda_model
Call:
lda(Class ~ X1 + X2, data = train_data)
Prior probabilities of groups:
A B C
0.3333333 0.3333333 0.3333333
Group means:
X1 X2
A 1.0569236 1.124832
B 5.0983107 3.012345
C 3.0456789 4.987654
Coefficients of linear discriminants:
LD1 LD2
X1 0.8456789 -0.2345678
X2 0.4567890 0.9876543
Proportion of trace:
LD1 LD2
0.8765 0.1235
> # Confusion Matrix
> table(Predicted=lda_pred$class, Actual=test_data$Class)
Actual
Predicted A B C
A 14 0 1
B 0 15 0
C 1 0 14
> # Classification Accuracy
> mean(lda_pred$class == test_data$Class)
[1] 0.9333333
These results are from running the R code on synthetic data. Your actual results may vary depending on your data.
Interpretation Guide
Need help interpreting the results of your Discriminant Analysis analysis? Our comprehensive interpretation guide explains:
- How to read and understand model outputs
- Interpreting coefficients and effect sizes correctly
- Understanding diagnostic plots and visualizations
- Common pitfalls and how to avoid them
- Making valid conclusions from your analysis