web-dev-qa-db-fra.com

R - Comment rendre le biplot PCA plus lisible

J'ai un ensemble d'observations avec 23 variables.

Lorsque j'utilise prcomp et biplot pour tracer les résultats, je rencontre plusieurs problèmes:

  1. le tracé réel occupe seulement la moitié du cadre (x <0), mais le tracé est centré sur 0, donc la moitié de l'espace est gaspillée

  2. deux variables dominent clairement les résultats, donc toutes les autres flèches sont regroupées et je ne peux rien lire

annonce 1. J'ai essayé de définir xlim et/ou ylim, mais je fais évidemment quelque chose de mal car l'intrigue est complètement foirée quand je le fais

annonce 2. Puis-je simplement espacer les étiquettes des flèches pour pouvoir les lire? Ou peut-être que je pourrais simplement tracer les flèches sans les deux plus longues (sorte de zoom avant)?

My PCA plot

Addendum: est-il possible d'avoir biplot dessiner les étiquettes dans une couleur différente de celle des flèches?

Aussi: est-ce problématique si les axes x et y ne sont pas proportionnels (le graphique montre des intervalles de longueur différente sur x et y). Je pense que cela fausserait les anges entre les flèches, et ce type de redimensionnement n'est pas une transformation de similitude. Est-il possible de forcer le biplot pour conserver un rapport d'aspect de 1: 1, ou de dessiner l'intrigue sous forme de rectangle et non de carré?

12
Jakub Bochenski

Je pense que vous pouvez utiliser xlim et ylim. Jetez également un œil à l'argument expand pour ?biplot. Malheureusement, vous n'avez fourni aucune donnée, prenons donc quelques exemples de données:

a <- princomp(USArrests)

Ci-dessous le résultat de simplement appeler biplot:

biplot(a)

enter image description here

Et maintenant, on peut "zoomer" pour regarder de plus près "Meurtre" et "Viol" en utilisant xlim et ylim et également utiliser l'argument de mise à l'échelle expand de ?biplot:

biplot(a, expand=10, xlim=c(-0.30, 0.0), ylim=c(-0.1, 0.1))

enter image description here

Veuillez noter les différentes échelles sur les axes supérieur et droit en raison du facteur expand.

Est-ce que cela aide à rendre votre jument intrigue lisible?

[~ # ~] modifier [~ # ~]

Vous avez également demandé s'il était possible d'avoir des couleurs différentes pour les étiquettes et les flèches. biplot ne prend pas en charge cela, ce que vous pourriez faire est de copier le code de stats:::biplot.default puis modifiez-le selon vos besoins (changez l'argument col lorsque plot, axis et text est utilisé).

Vous pouvez également utiliser ggplot pour le biplot. Dans le post ici , une fonction biplot simple est implémentée. Vous pouvez modifier le code comme suit:

PCbiplot <- function(PC, x="PC1", y="PC2", colors=c('black', 'black', 'red', 'red')) {
    # PC being a prcomp object
    data <- data.frame(obsnames=row.names(PC$x), PC$x)
    plot <- ggplot(data, aes_string(x=x, y=y)) + geom_text(alpha=.4, size=3, aes(label=obsnames), color=colors[1])
    plot <- plot + geom_hline(aes(0), size=.2) + geom_vline(aes(0), size=.2, color=colors[2])
    datapc <- data.frame(varnames=rownames(PC$rotation), PC$rotation)
    mult <- min(
        (max(data[,y]) - min(data[,y])/(max(datapc[,y])-min(datapc[,y]))),
        (max(data[,x]) - min(data[,x])/(max(datapc[,x])-min(datapc[,x])))
        )
    datapc <- transform(datapc,
            v1 = .7 * mult * (get(x)),
            v2 = .7 * mult * (get(y))
            )
    plot <- plot + coord_equal() + geom_text(data=datapc, aes(x=v1, y=v2, label=varnames), size = 5, vjust=1, color=colors[3])
    plot <- plot + geom_segment(data=datapc, aes(x=0, y=0, xend=v1, yend=v2), arrow=arrow(length=unit(0.2,"cm")), alpha=0.75, color=colors[4])
    plot
}

Tracer comme suit:

fit <- prcomp(USArrests, scale=T)
PCbiplot(fit, colors=c("black", "black", "red", "yellow"))

enter image description here

Si vous jouez un peu avec cette fonction, je suis sûr que vous pouvez comprendre comment définir les valeurs xlim et ylim, etc.

23
user1981275