Diskriminanzanalyse (LDA) mit R
Kommentiertes Codebeispiel
Arndt Regorz, Dipl. Kfm. & MSc. Psychologie, 09.12.2025
Einführung
Wenn Sie eine MANOVA durchführen und diese signifikant wird, dann werden Sie häufig als Follow-up-Analyse eine lineare Diskriminanzanalyse durchführen wollen um festzustellen, welchen Beitrag die verschiedenen AVs zur signifikanten MANOVA geleistet haben.
Dieses Tutorial wird zunächst Datenaufbereitung und die eigentliche MANOVA zeigen. Anschließend folgt die Diskriminanzanalyse. Das Tutorial endet mit dem Code für eine grafische Aufbereitung der Ergebnisse der Diskriminanzanalyse.
Vorbereitung der Daten
Dieses Tutorial nutzt als Beispieldatensatz mtcars, der mit der Basisversion von R ausgeliefert wird. Dabei werden zahlreiche Automobilmodelle hinsichtlich verschiedener Parameter miteinander verglichen.
head(mtcars)
# AVs:
# mpg (Miles/gallon) = Verbrauch
# qsec (1/4 mile time) = Beschleunigung
# Faktor: gear - Gänge (als Faktor) - 3, 4, 5
# Anzahl Gänge als Faktor
mtcars_t <- mtcars
mtcars_t$gear <- as.factor(mtcars_t$gear)
Aufruf der MANOVA
erg_manova <- manova(cbind(mpg, qsec) ~ gear,
data = mtcars_t)
summary(erg_manova)
Aufruf der linearen Diskriminanzanalye (LDA)
Für die LDA benötigen wir das Package MASS.
library(MASS)
Der Aufruf der Diskrimananzanalyse ist genau "spiegelverkehrt" zum Aufruf der MANOVA. Bei der Diskriminanzanalyse sagen wir Gruppenunterschiede durch mehrere kontinuierliche Variable voraus.
Wenn die verschiedenen Prädiktorvariablen der LDA (= AVs der MANOVA) auf unterschiedlichen Metriken gemessen werden - wie in diesem Fall hier - dann empfiehlt es sich, diese zu z-standardisieren.
erg_lda <- lda(gear ~ scale(mpg) + scale(qsec), data = mtcars_t)
Einen Überblick über die Ergebnisse bekommt man so:
erg_lda
Die wichtigsten Ergebnisse sind unten bei den Diskriminanzfunktionen.
Coefficients of linear discriminants:
LD1 LD2
scale(mpg) 1.4127604 -0.1671782
scale(qsec) -0.7485772 -1.1700394
Proportion of trace:
LD1 LD2
0.5404 0.4596
Hier sieht man, dass die erste Diskriminanzfunktion LD1 zu ca. 2/3 vom Verbrauch abhängt und zu 1/3 von der Beschleunigung und Autos mit hohem mpg und niedrigem qsec von Autos mit niedrigem mpg und hohem qsec trennt.
Die zweite Diskriminanzfunktion LD2 hingegen hängt fast auschließlich von der Beschleunigung ab.
Und beide Diskriminanzfunktionen tragen substantiell zum Unterschied zwischen den Gruppen bei (54% bzw. 46%).
Man könnte sich noch die Gruppenmittelwerte anzeigen lassen, wobei das bei z-standardisierten Variablen weniger interessant ist.
# Mittelwerte der Gruppen
erg_lda$means
Wenn Sie wissen möchten, wie die verschiedenen Untersuchungseinheiten (hier: Autos) auf den beiden Diskriminanzfunktionen angeordnet sind, können Sie das mit der predict()-Funktion anfordern.
# Vorhersage von Diskriminanzwerten
lda_vorhers <- predict(erg_lda)
# Werte der Diskriminanzfunktion
head(lda_vorhers$x)
Um die Güte der Klassifikation durch die LDA zu beurteilen, können Sie vorhergesagte und tatsächliche Gruppenzugehörigkeiten gegenüberstellen. Das ist allerdings als Follow-up-Analyse für eine MANOVA weniger interessant. Wenn Sie jedoch die LDA eigenständig zur Vorhersage von Gruppenzugehörigkeiten nutzen, bietet das wertvolle Informationen.
# Klassifikationsergebnisse
table(Vorhergesagt = lda_vorhers$class, Tatsaechlich = mtcars_t$gear)
Graphische Darstellung (bei 2 AVS der MANOVA)
Wenn Sie eine MANOVA mit genau zwei AVs durchführen, dann kann man die Ergebnisse der LDA sehr schön graphisch in einem Streudiagramm darstellen.
Zunächst der Code für Streudiagramm und Legende:
plot(scale(mtcars_t$mpg),
scale(mtcars_t$qsec),
col = mtcars_t$gear,
pch = 19,
asp = 1)
legend("topright",
legend = levels(mtcars_t$gear),
col = seq_along(levels(mtcars_t$gear)),
pch = 19)
Anschließend werden noch die Pfeile für die Diskriminanzfunktionen hinzugefügt.
sc <- erg_lda$scaling
sc
Wenn wie hier z-standardisierte Werte verwendet werden, passt normalerweise die Skalierung. Sonst können Sie die Größe der Pfeile noch ändern duch Anpassung des scale_factor.
scale_factor = 1
arrows(0, 0,
sc[1,1] * scale_factor,
sc[2,1] * scale_factor,
col = "blue", lwd = 2)
arrows(0, 0,
sc[1,2] * scale_factor,
sc[2,2] * scale_factor,
col = "brown", lwd = 2)
Im Ergebnis sehen Sie hier die beiden Diskriminanzfunktionen als Pfeile (Vektoren) im zweidimensionalen Raum der beiden AVs der MANOVA: