Les "coordonnées étoiles" sont destinées à être modifiées de manière interactive, en commençant par une valeur par défaut. Cette réponse montre comment créer la valeur par défaut; les modifications interactives sont un détail de programmation.
Les données sont considérées comme une collection de vecteurs dans . Celles-ci sont d'abord normalisées séparément à l'intérieur de chaque coordonnée, transformant linéairement les données en l'intervalle . Cela se fait, bien sûr, en soustrayant d'abord leur minimum de chaque élément et en divisant par la plage. Appelez les données normalisées .xj=(xj1,xj2,…,xjd)Rd{xji,j=1,2,…}[0,1]zj
La base habituelle de est l'ensemble des vecteurs ayant un seul dans le lieu. En termes de cette base, . Une "projection de coordonnées d'étoiles" choisit un ensemble de vecteurs unitaires distincts dans et mappe à . Ceci définit une transformation linéaire de à . Cette carte est appliquée auRdei=(0,0,…,0,1,0,0,…,0)1ithzj=zj1e1+zj2e2+⋯+zjded{ui,i=1,2,…,d}R2eiuiRdR2zj- ce n'est qu'une multiplication matricielle - pour créer un nuage de points bidimensionnel, représenté comme un nuage de points. Les vecteurs unitaires sont dessinés et étiquetés pour référence.ui
(Une version interactive permettra à l'utilisateur de faire pivoter chacun des individuellement.)ui
Pour illustrer cela, voici une R
implémentation appliquée à un ensemble de données de caractéristiques de performances automobiles. Obtenons d'abord les données:
library(MASS)
x <- subset(Cars93,
select=c(Price, MPG.city, Horsepower, Fuel.tank.capacity, Turn.circle))
La première étape consiste à normaliser les données:
x.range <- apply(x, 2, range)
z <- t((t(x) - x.range[1,]) / (x.range[2,] - x.range[1,]))
Par défaut, créons vecteurs unitaires également espacés pour . Ceux-ci déterminent la projection qui est appliquée à :duiprj
z
d <- dim(z)[2] # Dimensions
prj <- t(sapply((1:d)/d, function(i) c(cos(2*pi*i), sin(2*pi*i))))
star <- z %*% prj
C'est tout - nous sommes tous prêts à comploter. Il est initialisé pour laisser de la place aux points de données, aux axes de coordonnées et à leurs étiquettes:
plot(rbind(apply(star, 2, range), apply(prj*1.25, 2, range)),
type="n", bty="n", xaxt="n", yaxt="n",
main="Cars 93", xlab="", ylab="")
Voici l'intrigue elle-même, avec une ligne pour chaque élément: axes, étiquettes et points:
tmp <- apply(prj, 1, function(v) lines(rbind(c(0,0), v)))
text(prj * 1.1, labels=colnames(z), cex=0.8, col="Gray")
points(star, pch=19, col="Red"); points(star, col="0x200000")
Pour comprendre ce graphique, il pourrait être utile de le comparer à une méthode traditionnelle, la matrice de nuage de points:
pairs(x)
Une analyse en composantes principales (ACP) basée sur la corrélation crée presque le même résultat.
(pca <- princomp(x, cor=TRUE))
pca$loadings[,1]
biplot(pca, choices=2:3)
La sortie de la première commande est
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
1.8999932 0.8304711 0.5750447 0.4399687 0.4196363
La majeure partie de la variance est attribuable à la première composante (1,9 contre 0,83 et moins). Les chargements sur ce composant sont de taille presque égale, comme le montre la sortie de la deuxième commande:
Price MPG.city Horsepower Fuel.tank.capacity Turn.circle
0.4202798 -0.4668682 0.4640081 0.4758205 0.4045867
Cela suggère - dans ce cas - que le tracé des coordonnées étoiles par défaut se projette le long de la première composante principale et montre donc, essentiellement, une combinaison bidimensionnelle des deuxième à cinquième PC. Sa valeur par rapport aux résultats de l'ACP (ou à une analyse factorielle connexe) est donc discutable; le principal mérite peut être dans l'interactivité proposée.
Bien que R
le biplot par défaut soit horrible, le voici à titre de comparaison. Pour qu'il corresponde mieux au tracé des coordonnées des étoiles, vous devez permuter pour qu'il corresponde à la séquence des axes indiquée dans ce biplot.ui