2013-06-11 10 views
8

Mam zestaw obserwacji z 23 zmiennymi.R - jak uczynić biplot PCA bardziej czytelnym

Podczas korzystania prcomp i biplot nakreśliłbyś wyniki, które działają na kilka problemów:

  1. rzeczywisty wykres zajmuje tylko połowę ramki (x < 0), ale wykres skupia się na 0, tak połowa powierzchni jest marnowana

  2. dwie zmienne clearily zdominować wyniki, więc wszystkie inne strzały są zbite w grudki razem i nie mogę czytać rzeczy

ad 1. Próbowałem ustawić xlim i/lub ylim, ale najwyraźniej robię coś nie tak, ponieważ cały wątek jest zawalony, gdy wykonuję

ad 2. Czy mogę po prostu jakoś rozłożyć etykiety strzałek tak, aby że mogę je przeczytać? A może mógłbym po prostu wykreślić strzałki bez dwóch najdłuższych (rodzaj powiększenia)?

My PCA plot

Uzupełnienie: czy to możliwe, aby mieć biplot narysować etykiety w innym kolorze niż strzałki?

Ponadto: czy problematyczne jest, jeśli osie x i y są nieproporcjonalne (wykres pokazuje interwały o różnej długości na x i y). Myślę, że to przekrzywiłoby anioły między strzałami, a tego rodzaju zmiana rozmiaru nie jest transformacją podobieństwa. Czy można wymusić biplot, aby zachować proporcje 1: 1, lub aby narysować wykres jako prostokąt, a nie kwadrat?

Odpowiedz

19

Myślę, że można użyć xlim i ylim. Zobacz także argument expand dla ?biplot. Niestety, nie przedstawił żadnych danych, więc rzućmy niektóre dane przykładowe:

a <- princomp(USArrests) 

Poniżej wyniku właśnie dzwoni biplot:

biplot(a) 

enter image description here

I teraz można „powiększyć "przyjrzeć się bliżej" morderstwom "i" gwałtu "przy użyciu xlim i ylim, a także użyć argumentu skalowania expand z ?biplot:

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

enter image description here

Proszę zwrócić uwagę na inny skalowanie na górnej i prawej osi ze względu na czynnik expand.

Czy pomaga to w uzyskaniu czytelności klaczy?

EDIT

też pytanie, czy możliwe jest, aby mieć różne kolory etykiet i strzały.biplot nie obsługuje tego, co można zrobić, aby skopiować kod stats:::biplot.default, a następnie zmienić go w zależności od potrzeb (zmiana col argument, gdy używane są plot, axis i text).

Można również użyć biplot jako ggplot. W poście here zaimplementowano prostą funkcję biplot. Można zmienić kod w następujący sposób:

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 
} 

Plot następująco:

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

enter image description here

Jeśli poeksperymentować trochę z tej funkcji, jestem pewien, że można dowiedzieć się, jak ustaw wartości xlim i ylim itd.

+0

Dzięki, zanim dostałem dużo ostrzeżeń w konsoli, ale teraz działa. Może mógłbyś również dodać dodatkowe pytanie dotyczące kolorów. –

+0

@ Colours - oto, czego się spodziewałem, dzięki za gotowy kod BTW co z tym "skopiuj kod źródłowy i zmodyfikuj go" w R? Nie kwestionuję ważności twojego anwsera, ale jest to raczej wątpliwa praktyka z punktu widzenia inżynierii oprogramowania. –

+0

Na ostatniej notatce nie spodziewam się, że możliwe jest posiadanie prostokątnej działki z biplotem. Czy to są połączenia geom_hline i geom_vline w twoim przykładzie, które muszę zmienić? –

Powiązane problemy