Как получить данные с частичной корреляцией из матрицы? - PullRequest
1 голос
/ 08 мая 2019

У меня есть матрица, по которой я вычисляю корреляции между моими столбцами.Я создал функцию, которая выдает результат в виде матрицы корреляции (из-за функции apply()), но я бы хотел получить кадр данных парной корреляции напрямую.Можно ли сделать это без какой-либо промежуточной матрицы: matrix -> dataframe парной корреляции

cor_rho<-function(y) {
res <- foreach(i = seq_len(ncol(y)),
.combine = rbind,
.multicombine = TRUE,
.inorder = FALSE,
.packages = c('data.table', 'doParallel')) %dopar% {
apply(y, 2, function(x) 1 - ((var(y[,i] - x)) / (var(y[,i]) + var(x))))}
return(res)}

Это та же функция, я просто добавил несколько строк для получения data.frame, который я хочу

cor_rho<-function(y) {
res <- foreach(i = seq_len(ncol(y)),
.combine = rbind,
.multicombine = TRUE,
.inorder = FALSE,
.packages = c('data.table', 'doParallel')) %dopar% {
apply(y, 2, function(x) 1 - ((var(y[,i] - x)) / (var(y[,i]) + var(x))))}
colnames(res)=rownames(res)=colnames(y)
Df<-data.frame(var1=rownames(res)[row(res)[upper.tri(res)]],
var2=colnames(res)[col(res)[upper.tri(res)]],
corr=res[upper.tri(res)])
return(Df)}

, что дает мне что-то вроде этого

var1 var2 value
var1 var3 value
var2 var3 value 

1 Ответ

0 голосов
/ 08 мая 2019

Я использую только dplyr и reshape2, это работает для того, что вы хотите?

library(reshape2)
library(dplyr)

set.seed(1)
n <- 10
df <- data.frame(var1 = rnorm(n), var2 = rnorm(n), var3 = rnorm(n))
melt(cor(df), id = c("Var1", "Var2")) %>%
  filter(Var1 != Var2) %>%
  filter(duplicated(value))

Я сделал предположение, которое может вас раздражать, это не допускать дублирования между коэффициентом корреляции и симметричным отношением. Я надеюсь, что это поможет.

Редактировать 1:

Я смотрю в Интернете, я нахожу следующий пакет: corrr, в котором есть функция correlate, которая возвращает вам непосредственно data.frame. Если вы хотите указать выходные данные, следующие строки дают вам что-то похожее:

install.packages('corrr')
library(corrr)
stretch(correlate(df))

Но после этого вам нужно сделать тот же трюк, что и выше, чтобы получить только то, что вы хотите.

Редактировать 2:

Я снова заглядываю в интернет, чтобы понять, что может вам помочь, на самом деле единственный пакет, который принимает матрицу на входе и выдает data.frame на выходе, это corrr, но я проверил его на большей матрице, и это действительно медленный.

n <- 100
p <- 8000
m <- n * p 
df <- data.frame(matrix(rnorm(m), nrow = n, ncol = p))


t <- Sys.time()
m_cor <- cor(df)
t <- Sys.time() - t
t1 <- t 

library(corrr)

t <- Sys.time()
m_cor <- correlate(df)
t <- Sys.time() - t
t2 <- t

library(propagate)

t <- Sys.time()
m_cor <- bigcor(df)
t <- Sys.time() - t
t3 <- t

Принимая во внимание, что propogate кажется хорошей идеей для работы с очень большой матрицей, но я не уверен, что хорошо понимаю тип ff выходных данных. В моем примере базовая функция cor работает быстрее, чем два других решения. Нашли ли вы решение?

Буду рад видеть ваше предложение, потому что это интересный вопрос.

...