As "coordenadas em estrela" devem ser modificadas interativamente, começando com um padrão. Esta resposta mostra como criar o padrão; as modificações interativas são um detalhe de programação.
Os dados são considerados uma coleção de vetores em . Estes são normalizados primeiro separadamente em cada coordenada, transformando linearmente os dados no intervalo . Isso é feito, é claro, primeiro subtraindo o mínimo de cada elemento e dividindo pelo intervalo. Chame os dados normalizados .R d { x j i , j = 1 , 2 , … } [ 0 , 1 ] z jxj=(xj1,xj2,…,xjd)Rd{xji,j=1,2,…}[0,1]zj
A base usual de é o conjunto de vetores com um único no lugar. Em termos dessa base, . Um "coordenadas estrela projecção" escolhe um conjunto de vectores de unidades distintas em e mapeia para . Isso define uma transformação linear de para . Este mapa é aplicado aoRdei=(0,0,…,0,1,0,0,…,0)1ithzj=zj1e1+zj2e2+⋯+zjdedR 2 e i u i R d R 2 Z j u i{ui,i=1,2,…,d}R2eiuiRdR2zj--é apenas uma multiplicação de matrizes - para criar uma nuvem de pontos bidimensional, representada como um gráfico de dispersão. Os vetores unitários são desenhados e rotulados para referência.ui
(Uma versão interativa permitirá que o usuário gire cada um dos individualmente.)ui
Para ilustrar isso, aqui está uma R
implementação aplicada a um conjunto de dados de características de desempenho de automóveis. Primeiro vamos obter os dados:
library(MASS)
x <- subset(Cars93,
select=c(Price, MPG.city, Horsepower, Fuel.tank.capacity, Turn.circle))
O passo inicial é normalizar os dados:
x.range <- apply(x, 2, range)
z <- t((t(x) - x.range[1,]) / (x.range[2,] - x.range[1,]))
Como padrão, vamos criar vetores de unidade igualmente espaçados para o . Eles determinam a projeção aplicada a :u i zduiprj
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
É isso aí - estamos todos prontos para tramar. É inicializado para fornecer espaço para os pontos de dados, os eixos de coordenadas e seus rótulos:
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="")
Aqui está o próprio gráfico, com uma linha para cada elemento: eixos, rótulos e pontos:
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 entender esse gráfico, pode ser útil compará-lo a um método tradicional, a matriz de gráficos de dispersão:
pairs(x)
Uma análise de componentes principais (PCA) baseada em correlação cria quase o mesmo resultado.
(pca <- princomp(x, cor=TRUE))
pca$loadings[,1]
biplot(pca, choices=2:3)
A saída para o primeiro comando é
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
1.8999932 0.8304711 0.5750447 0.4399687 0.4196363
A maior parte da variação é explicada pelo primeiro componente (1,9 versus 0,83 e menos). As cargas neste componente são quase iguais em tamanho, como mostra a saída para o segundo comando:
Price MPG.city Horsepower Fuel.tank.capacity Turn.circle
0.4202798 -0.4668682 0.4640081 0.4758205 0.4045867
Isso sugere - nesse caso - que o gráfico de coordenadas em estrela padrão está projetando-se ao longo do primeiro componente principal e, portanto, está mostrando, essencialmente, alguma combinação bidimensional do segundo ao quinto PCs. Seu valor comparado aos resultados do PCA (ou uma análise fatorial relacionada) é, portanto, questionável; o principal mérito pode estar na interatividade proposta.
R
ui