Las "coordenadas de estrella" están destinadas a ser modificadas interactivamente, comenzando con un valor predeterminado. Esta respuesta muestra cómo crear el valor predeterminado; Las modificaciones interactivas son un detalle de programación.
Los datos se consideran una colección de vectores. Xj= (Xj 1,Xj 2, ... ,Xj d) en Rd. Primero se normalizan por separado dentro de cada coordenada, transformando linealmente los datos.{xji,j=1,2,…} en el intervalo [0,1]. Esto se hace, por supuesto, primero restando su mínimo de cada elemento y dividiendo por el rango. Llamar a los datos normalizadoszj.
La base habitual de Rd es el conjunto de vectores ei=(0,0,…,0,1,0,0,…,0) teniendo un solo 1 en el ithsitio. En términos de esta base,zj=zj1e1+zj2e2+⋯+zjded. Una "proyección de coordenadas de estrella" elige un conjunto de vectores unitarios distintos{ui,i=1,2,…,d} en R2 y mapas ei a ui. Esto define una transformación lineal deRd a R2. Este mapa se aplica a lazj--es solo una multiplicación matricial-- para crear una nube de puntos bidimensional, representada como un diagrama de dispersión. Los vectores unitariosui están dibujados y etiquetados para referencia.
(Una versión interactiva permitirá al usuario rotar cada una de las ui individualmente.)
Para ilustrar esto, aquí hay una R
implementación aplicada a un conjunto de datos de características de rendimiento del automóvil. Primero obtengamos los datos:
library(MASS)
x <- subset(Cars93,
select=c(Price, MPG.city, Horsepower, Fuel.tank.capacity, Turn.circle))
El paso inicial es normalizar los datos:
x.range <- apply(x, 2, range)
z <- t((t(x) - x.range[1,]) / (x.range[2,] - x.range[1,]))
Por defecto, creemos d vectores unitarios igualmente espaciados para el ui. Estos determinan la proyección prj
que se aplica az:
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
Eso es todo, todos estamos listos para tramar. Se inicializa para proporcionar espacio para los puntos de datos, los ejes de coordenadas y sus etiquetas:
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="")
Aquí está el gráfico en sí, con una línea para cada elemento: ejes, etiquetas y puntos:
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")
Para comprender este gráfico, podría ser útil compararlo con un método tradicional, la matriz de diagrama de dispersión:
pairs(x)
Un análisis de componentes principales (PCA) basado en correlación crea casi el mismo resultado.
(pca <- princomp(x, cor=TRUE))
pca$loadings[,1]
biplot(pca, choices=2:3)
La salida para el primer comando es
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
1.8999932 0.8304711 0.5750447 0.4399687 0.4196363
La mayor parte de la varianza se explica por el primer componente (1.9 versus 0.83 y menos). Las cargas en este componente son casi iguales en tamaño, como se muestra en la salida del segundo comando:
Price MPG.city Horsepower Fuel.tank.capacity Turn.circle
0.4202798 -0.4668682 0.4640081 0.4758205 0.4045867
Esto sugiere, en este caso, que la gráfica de coordenadas de estrella predeterminada se está proyectando largo del primer componente principal y, por lo tanto, muestra, esencialmente, una combinación bidimensional de las PC segunda a quinta. Su valor en comparación con los resultados de PCA (o un análisis factorial relacionado) es, por lo tanto, cuestionable; El mérito principal puede estar en la interactividad propuesta.
Aunque R
el biplot predeterminado se ve horrible, aquí es para comparar. Para que coincida mejor con el diagrama de coordenadas de la estrella, deberá permutar elui para estar de acuerdo con la secuencia de ejes que se muestra en este biplot.