Как получить список собственных векторов в R

#r #ggplot2

Вопрос:

Когда я выполняю приведенный ниже код для своих данных, поскольку в них 35 переменных, результирующий график почти бесполезен из-за всего перекрытия. Кажется, я не могу найти ничего, что дало бы мне список данных, которые использовались для построения сюжета. Например, у меня есть коэффициент под названием avg_sour, который имеет направление около 272 градусов и величину 1. Это одно из немногих, что я действительно вижу. Однако, если бы у меня были эти данные в таблице, я мог бы четко видеть, что я ищу, без необходимости каждый раз увеличивать и уменьшать масштаб. Добавьте к этому тот факт, что это для презентации, поэтому мне нужно быстро сделать это видимым, чтобы они не смотрели на разные вещи, но я думаю, что мне сойдет с рук переполненный график и таблица, которая объясняет переполненную часть. Кажется, это должно быть просто, но…Боюсь, я еще не нашел его. Есть какие-нибудь идеи? Я могу использовать любую посылку, которую смогу найти.

 ggbiplot(xD4PCA,obs.scale = .1, var.scale = 1, 
     varname.size = 3, labels.size=6, circle = T, alpha = 0, center = T) 
     scale_x_continuous(limits=c(-2,2))  
     scale_y_continuous(limits=c(-2,2))
 

введите описание изображения здесь

Ответ №1:

Если ваша xD4PCA функция от prcomp функции, то $rotation она дает вам собственные векторы. См. раздел Значение функции prcomp.

Вы можете вручную выбрать и добавить стрелки из xD4PCA$rotation[,1:2]

Я работал над этим с образцами данных ir.pca , которые представляют собой простой prcomp объект, использующий iris данные, и все эти задания основаны на исходном коде ggbiplot.

 pcobj <- ir.pca # change here with your prcomp object
nobs.factor <- sqrt(nrow(pcobj$x) - 1)
d <- pcobj$sdev
u <- sweep(pcobj$x, 2, 1 / (d * nobs.factor), FUN = '*')
v <- pcobj$rotation


choices = 1:2
choices <- pmin(choices, ncol(u))
df.u <- as.data.frame(sweep(u[,choices], 2, d[choices]^obs.scale, FUN='*'))
v <- sweep(v, 2, d^1, FUN='*')
df.v <- as.data.frame(v[, choices])
names(df.u) <- c('xvar', 'yvar')
names(df.v) <- names(df.u)
df.u <- df.u * nobs.factor
r <- sqrt(qchisq(circle.prob, df = 2)) * prod(colMeans(df.u^2))^(1/4)
v.scale <- rowSums(v^2)
df.v <- r * df.v / sqrt(max(v.scale))
df.v$varname <- rownames(v)
df.v$angle <- with(df.v, (180/pi) * atan(yvar / xvar))
df.v$hjust = with(df.v, (1 - 1.5 * sign(xvar)) / 2)
theta <- c(seq(-pi, pi, length = 50), seq(pi, -pi, length = 50))
circle <- data.frame(xvar = r * cos(theta), yvar = r * sin(theta))
df.v <- df.v[1:2,] # change here like df.v[1:2,]

ggbiplot::ggbiplot(ir.pca,obs.scale = .1, var.scale = 1, 
                   varname.size = 3, labels.size=6, circle = T, alpha = 0, center = T, var.axes = FALSE) 
  scale_x_continuous(limits=c(-2,2))  
  scale_y_continuous(limits=c(-2,2))  
  geom_segment(data = df.v, aes(x = 0, y = 0, xend = xvar, yend = yvar),
               arrow = arrow(length = unit(1/2, 'picas')), 
               color = muted('red'))  
  geom_text(data = df.v, 
            aes(label = rownames(df.v), x = xvar, y = yvar, 
                angle = angle, hjust = hjust), 
            color = 'darkred', size = 3)
ggbiplot::ggbiplot(ir.pca) 
  scale_x_continuous(limits=c(-2,2))  
  scale_y_continuous(limits=c(-2,2))   
  geom_path(data = circle, color = muted('white'), 
            size = 1/2, alpha = 1/3)
 

Исходный(имеющий все четыре переменные)

введите описание изображения здесь

Отредактированная одна(выберите только первые две переменные)

введите описание изображения здесь

Комментарии:

1. Эй, круто. Есть ли хороший способ обозначить те результирующие точки данных, которые я строю?

2. @DaveX Я работал над твоим делом. Поскольку ggbiplot у вас нет возможности для ваших целей, я вручную изменяю код. Я написал change here . Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.

3. Вау, это большая работа. Спасибо, что нашли время. Я продолжаю получать ошибки, такие как «объект» obs.масштаб «не найден» и т. Д.

4. @DaveX Попробуйте добавить obs.scale = .1 в верхней части кода.

5. Потрясающе. Это круг. возможно, таким же образом?