J'ai des données multidimensionnelles (plus de 100 variables) dont je m'attends à ce que le sous-ensemble soit plus ou moins conforme à un plan. Quelle serait la meilleure façon d'adapter un plan à ce sous-ensemble dans R? Je voudrais utiliser le plan pour calculer la distance de certains autres points et pour en tracer certaines dimensions.Ajustement d'un plan multidimensionnel dans R
Répondre
Les principaux composants peuvent résoudre ceci pour vous. En supposant que vos données correspondent vraiment à un plan, les deux premiers composants principaux doivent bien décrire ce plan.
Vous ne fournissez pas de données d'échantillon, donc je vais illustrer avec des données artificielles. Mes données sont en dix dimensions, mais tous les points sont proches d'un plan (avec une erreur dans les huit autres directions).
## Sample data
set.seed(2018)
NPts = 1000
x = runif(NPts)
y = runif(NPts)
cx = rnorm(1)
cy = rnorm(1)
V1 = cx*x + cy*y + rnorm(NPts, 0, 0.1)
MyData = data.frame(V1)
for(i in 2:10) {
cx=rnorm(1)
cy= rnorm(1)
name = paste0("V", i)
MyData[,name] = cx*x + cy*y + rnorm(NPts, 0, 0.1)
}
Comme toutes les variables sont des combinaisons linéaires de x et y (plus une petite erreur), les données sont seulement deux dimensions et vit à proximité du plan x-y. Ici, je traite x et y comme des variables latentes. Ils n'apparaissent pas dans les données mais pilotent le comportement de toutes les autres variables.
## Principal Components Analysis
PCA = prcomp(MyData)
plot(PCA)
Oui, les données ressemble fondamentalement à deux dimensions. Il ne reste plus qu'à obtenir les deux premiers composants principaux. Ils sont stockés dans la structure retournée de prcomp
.
PCA$rotation[,1:2]
PC1 PC2
V1 0.42752681 -0.204894748
V2 -0.64546573 -0.056503044
V3 0.04606707 -0.009614603
V4 0.01956126 -0.539070667
V5 0.15987617 0.600122935
V6 -0.06255399 0.054053476
V7 0.26497132 0.388920891
V8 0.21645814 -0.366709584
V9 0.49363625 -0.116954131
V10 0.08874645 0.040656622
Le plan que nous cherchons est le plan engendré par ces deux vecteurs.