2012-04-07 8 views
2

Я выполняю анализ основных компонентов в наборе данных с более чем 1000 переменными. Я использую R Studio, и когда я запускаю сводку, чтобы увидеть кумулятивную дисперсию компонентов, я могу видеть только последние несколько сотен компонентов. Как ограничить резюме только показом, скажем, первых 100 компонентов?R - Конечный вывод summary.princomp

+0

Можете ли вы предоставить небольшой воспроизводимый пример? – digEmAll

+0

@ digemall На самом деле, набор данных огромен. Я просто запускаю: prin <- princomp (train [c (2: 1777)]) summary (prin) Когда я это делаю, он показывает информацию для всех основных компонентов 1776. Мне нужны только первые 100 или около того. – user1209675

+0

Да, конечно, не полный код. Я имел в виду пример litte, чтобы точно понять ваши шаги. Во всяком случае @joran получил смысл;) – digEmAll

ответ

1

Это довольно легко изменить print.summary.princomp (вы можете увидеть исходный код, введя stats:::print.summary.princomp), чтобы сделать это:

pcaPrint <- function (x, digits = 3, loadings = x$print.loadings, cutoff = x$cutoff,n, ...) 
{ 
    #Check for sensible value of n; default to full output 
    if (missing(n) || n > length(x$sdev) || n < 1){n <- length(x$sdev)} 
    vars <- x$sdev^2 
    vars <- vars/sum(vars) 
    cat("Importance of components:\n") 
    print(rbind(`Standard deviation` = x$sdev[1:n], `Proportion of Variance` = vars[1:n], 
     `Cumulative Proportion` = cumsum(vars)[1:n])) 
    if (loadings) { 
     cat("\nLoadings:\n") 
     cx <- format(round(x$loadings, digits = digits)) 
     cx[abs(x$loadings) < cutoff] <- paste(rep(" ", nchar(cx[1, 
      1], type = "w")), collapse = "") 
     print(cx[,1:n], quote = FALSE, ...) 
    } 
    invisible(x) 
} 

pcaPrint(summary(princomp(USArrests, cor=TRUE), 
       loadings = TRUE, cutoff = 0.2), digits = 2,n = 2) 

Отредактировано Чтобы включить базовую проверку на разумном значении для n. Теперь, когда я сделал это, я задаюсь вопросом, не стоит ли предлагать R Core как постоянное дополнение; кажется простым и, как будто это может быть полезно.

+0

Большое вам спасибо. Именно то, что мне нужно. Это упрощает процесс сбора данных. – user1209675

+0

@joran: да, это особенность, которую стоит отправить команде R-Core IMO. – digEmAll

0

Вы можете поместить нагрузки в матричную форму, вы можете сохранить матрицу в переменной, а затем подмножество (a la matrix[,1:100]), чтобы увидеть первый/средний/последний n. В этом примере я использовал head(). Каждый столбец является основным компонентом.

head(
    matrix(
    prin$loadings, 
     ncol=length(dimnames(prin$loadings)[[2]]), 
     nrow=length(dimnames(prin$loadings)[[1]]) 
), 
100) 
2

Я попробовал это, и это, кажется, работает: л = Нагрузки() прин л [1: 100]

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