2013-06-11 2 views
8

У меня есть набор наблюдений с 23 переменными.R - как сделать PCA biplot более читаемым

Когда я использую prcomp и biplot для построения результатов я бегу на несколько проблем:

  1. фактический участок занимает только половину кадра (х < 0), но сюжет сосредоточен на 0, поэтому половина пространства впустую

  2. две переменные clearily доминировать результаты, так что все остальные стрелки слипаются вместе, и я не могу читать вещь

ad 1. Я пробовал устанавливать xlim и/или ylim, но я, очевидно, что-то делаю неправильно, так как сюжет все испортился, когда я делаю

ad 2. Могу ли я как-то сделать ярлыки стрелок размещены больше друг от друга, что я могу их прочитать? Или, может быть, я мог бы просто нарисовать стрелки без двух самых длинных (вроде увеличения)?

My PCA plot

Добавление: можно иметь biplot сделать этикетки в другой цвет, чем стрелок?

Также: проблематично, если оси x и y не пропорциональны (на графике показаны интервалы разной длины по x и y). Я думаю, что это исказило бы ангелов между стрелками, и такое изменение размера не является трансформацией подобия. Можно ли заставить биплоттер сохранить соотношение сторон 1: 1 или рисовать участок как прямоугольник, а не квадрат?

ответ

19

Думаю, вы можете использовать xlim и ylim. Кроме того, посмотрите на аргумент expand для ?biplot. К сожалению, вы не предоставили никаких данных, поэтому давайте рассмотрим некоторые примеры данных:

a <- princomp(USArrests) 

Ниже результат просто звоню biplot:

biplot(a) 

enter image description here

И теперь можно «приближать «более подробно рассмотреть« Убийство »и« Изнасилование »с использованием xlim и ylim, а также использовать аргумент масштабирования expand от ?biplot:

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

enter image description here

Пожалуйста, обратите внимание на различное масштабирование на верхней и правой оси вследствие expand фактора.

Означает ли это, что бы сделать ваш участок кобылой удобочитаемым?

EDIT

Вы также спросили, возможно ли иметь различные цвета для этикеток и стрел.biplot не поддерживает это, что вы можете сделать, это скопировать код stats:::biplot.default, а затем изменить его в соответствии с вашими потребностями (изменение col аргумента, когда используется plot, axis и text).

В качестве альтернативы вы можете использовать ggplot для биплота. В сообщении here реализована простая функция биплота. Вы можете изменить код следующим образом:

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 
} 

Участок следующим образом:

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

enter image description here

Если вы играете немного с этой функцией, я уверен, вы можете понять, как set xlim и ylim значения и т. д.

+0

Спасибо, прежде чем я получу много предупреждений в консоли, но теперь он работает. Возможно, вы также можете задать добавленный вопрос о цветах. –

+0

@Colors - вот что я ожидал, спасибо за готовый код Кстати, что с этим "скопировать исходный код и изменить его" в R? Я не ставил под сомнение действительность вашего anwser, однако это довольно сомнительная практика с точки зрения разработки программного обеспечения. –

+0

На заключительном замечании я не ожидаю, что возможно иметь прямоугольный участок с биплотом. Это вызовы geom_hline и geom_vline в вашем примере, которые мне нужно изменить для этого? –

Смежные вопросы