2016-03-09 2 views
2

У меня есть матрица А, и я хочу, чтобы создать матрицу B, где:Агрегирования больших матриц

колонка 1 = колонок 1 матрицу А

колонок 2 = агрегацию двух столбцов, где столбец 1 матрицу А агрегируется с любым столбцом матрицы А, который больше всего коррелирует с

столбец 3 = совокупность трех столбцов, где агрегированный результат (столбец 2 матрицы В) агрегируется с любым столбцом А, который больше всего коррелирует с (кроме столбца из уже включенной матрицы A, этот был удален из матрицы A)

и т. Д.

Я петлю вычисление для корреляции, где вычисляю все корреляции на каждой итерации. Это работает при низких значениях r и n (для простоты я выбрал низкие значения в этом примере), но занимает очень много времени с большими наборами данных. Есть ли более быстрый/более эффективный способ сделать это? Предпочтительно метод, в котором мне не нужно было бы вычислять все корреляции на каждой итерации. Я пробовал такие функции, как bigcor(), но без успеха до сих пор.

ответ

1

Переместите это за пределы петли. Это не зависит от i: повышение производительности maxcor <- names(which.max(sapply(A[,-1, drop=F], function(x) cor(A[, 1], x))))

r <- 10 # rows 
n <- 6 # columns 

library(microbenchmark) 
microbenchmark(OP = { 
    A <- data.frame(matrix(rnorm(r*n),nrow=r)) # original data frame 
    B <- data.frame(matrix(nrow=r,ncol=n)) # results 
    B[,1] <- A[,1] 
    for (i in 2:n) { 
    maxcor <- names(which.max(sapply(A[,-1, drop=F], function(x) cor(A[, 1], x)))) 
    B[,i] <- A[,1] + A[,maxcor] 
    A[,1] <- B[,i] 
    A[,maxcor] <- NULL 
    } 
}, 
ALEX= { 
    A2 <- data.frame(matrix(rnorm(r*n),nrow=r)) # original data frame 
    B2 <- data.frame(matrix(nrow=r,ncol=n)) # results 
    B2[,1] <- A2[,1] 
    A3 <- A2 
    maxcor <- sapply(A3[,-1, drop=F], function(x) cor(A3[, 1], x)) 
    cor_n <- names(A2)[order(maxcor, decreasing=T)] 
    for (i in 1:length(cor_n)) { 
    B2[,i+1] <- A2[,1] + apply(A2[,cor_n[1:i], drop= FALSE], 1, sum) 
    } 
}, times=100L) 


Unit: milliseconds 
expr  min  lq  mean median  uq  max neval cld 
    OP 1.779013 1.806192 1.915267 1.835082 1.941329 3.585394 100 b 
ALEX 1.229343 1.253102 1.386429 1.300428 1.377404 2.925868 100 a 

30% ... А вот с дополнительной копией данных A3 <- A2, которые, очевидно, могут быть удалены

+0

Как поместить вне цикла когда я должен повторить процесс n-1 раз? – Joseph

+0

Что не ясно? Я хотел бы объяснить это более четко. – Joseph

+0

Концепция того, что вы пытаетесь сделать, не имеет для меня никакого смысла (статистически). Но я думаю, что теперь могу понять проблему кодирования ... Позвольте мне отладить и переписать мой ответ. –

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