Bei der Frage geht es darum, "zugrunde liegende [lineare] Beziehungen" zwischen Variablen zu identifizieren.
Die schnelle und einfache Methode zum Erkennen von Beziehungen besteht darin, mithilfe Ihrer bevorzugten Software eine andere Variable (verwenden Sie eine Konstante, gerade) gegen diese Variablen zu regressieren: Mit jeder guten Regressionsprozedur wird die Kollinearität erkannt und diagnostiziert. (Sie werden sich nicht einmal die Regressionsergebnisse ansehen müssen. Wir verlassen uns lediglich auf einen nützlichen Nebeneffekt beim Einrichten und Analysieren der Regressionsmatrix.)
0
(Es gibt eine Kunst und eine Menge Literatur, die sich mit der Identifizierung einer "kleinen" Belastung befasst. Um eine abhängige Variable zu modellieren, würde ich vorschlagen, sie in die unabhängigen Variablen in der PCA aufzunehmen, um die Komponenten zu identifizieren - unabhängig davon ihre Größen - wobei die abhängige Variable eine wichtige Rolle spielt. Aus dieser Sicht bedeutet "klein" viel kleiner als jede solche Komponente.)
Schauen wir uns einige Beispiele an. (Diese werden R
für die Berechnungen und das Plotten verwendet.) Beginnen Sie mit einer Funktion zum Durchführen von PCA, suchen Sie nach kleinen Komponenten, zeichnen Sie sie und geben Sie die linearen Beziehungen zwischen ihnen zurück.
pca <- function(x, threshold, ...) {
fit <- princomp(x)
#
# Compute the relations among "small" components.
#
if(missing(threshold)) threshold <- max(fit$sdev) / ncol(x)
i <- which(fit$sdev < threshold)
relations <- fit$loadings[, i, drop=FALSE]
relations <- round(t(t(relations) / apply(relations, 2, max)), digits=2)
#
# Plot the loadings, highlighting those for the small components.
#
matplot(x, pch=1, cex=.8, col="Gray", xlab="Observation", ylab="Value", ...)
suppressWarnings(matplot(x %*% relations, pch=19, col="#e0404080", add=TRUE))
return(t(relations))
}
B , C, D ,EEIN
process <- function(z, beta, sd, ...) {
x <- z %*% beta; colnames(x) <- "A"
pca(cbind(x, z + rnorm(length(x), sd=sd)), ...)
}
Wir sind alle bereit zu gehen: Es bleibt nur B zu generieren , ...B , … , EA = B + C+ D + EA = B + ( C+ D ) / 2 + Esweep
n.obs <- 80 # Number of cases
n.vars <- 4 # Number of independent variables
set.seed(17)
z <- matrix(rnorm(n.obs*(n.vars)), ncol=n.vars)
z.mean <- apply(z, 2, mean)
z <- sweep(z, 2, z.mean)
colnames(z) <- c("B","C","D","E") # Optional; modify to match `n.vars` in length
B , … , EEIN
Die Ausgabe im oberen linken Bereich war
A B C D E
Comp.5 1 -1 -1 -1 -1
00 ≈ A - B - C- D - E
Die Ausgabe für das obere mittlere Panel war
A B C D E
Comp.5 1 -0.95 -1.03 -0.98 -1.02
( A , B , C, D , E)
A B C D E
Comp.5 1 -1.33 -0.77 -0.74 -1.07
EIN′= B′+ C′+ D′+ E′
1 , 1 / 2 , 1 / 2 , 1
In der Praxis ist es häufig nicht der Fall, dass eine Variable als offensichtliche Kombination der anderen herausgegriffen wird: Alle Koeffizienten können vergleichbare Größen und unterschiedliche Vorzeichen haben. Wenn es mehr als eine Dimension von Beziehungen gibt, gibt es keine eindeutige Möglichkeit, sie zu spezifizieren: Weitere Analysen (z. B. Zeilenreduzierung) sind erforderlich, um eine nützliche Grundlage für diese Beziehungen zu ermitteln. So funktioniert die Welt: Alles, was Sie sagen können, ist, dass diese speziellen Kombinationen, die von PCA ausgegeben werden, nahezu keinen Schwankungen der Daten entsprechen. Um dies zu bewältigen, verwenden einige Leute die größten ("Haupt-") Komponenten direkt als unabhängige Variablen in der Regression oder der nachfolgenden Analyse, in welcher Form auch immer. Vergessen Sie in diesem Fall nicht, zuerst die abhängige Variable aus dem Variablensatz zu entfernen und die PCA zu wiederholen!
Hier ist der Code, um diese Figur zu reproduzieren:
par(mfrow=c(2,3))
beta <- c(1,1,1,1) # Also can be a matrix with `n.obs` rows: try it!
process(z, beta, sd=0, main="A=B+C+D+E; No error")
process(z, beta, sd=1/10, main="A=B+C+D+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+C+D+E; Large error")
beta <- c(1,1/2,1/2,1)
process(z, beta, sd=0, main="A=B+(C+D)/2+E; No error")
process(z, beta, sd=1/10, main="A=B+(C+D)/2+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+(C+D)/2+E; Large error")
(Ich musste in den Fällen mit großen Fehlern an der Schwelle herumspielen, um nur eine einzelne Komponente anzuzeigen. Dies ist der Grund, warum dieser Wert als Parameter für angegeben wurde process
.)
Benutzer ttnphns hat uns freundlicherweise auf einen eng verwandten Thread aufmerksam gemacht. Eine seiner Antworten (von JM) schlägt den hier beschriebenen Ansatz vor.