Выполните корреляцию между каждой ячейкой двух векторного кадра данных в R, где каждая ячейка ссылается на имя вектора в другом кадре данных. - PullRequest
0 голосов
/ 25 мая 2018

У меня есть фрейм данных, который я создал с помощью expand.grid, который называется «list.paired» с двумя векторами следующим образом:

               Var1             Var2
1          measure1              measure1 
2          measure2              measure1
3          measure3              measure1
4          measure4              measure1
5          measure5              measure1
6          measure6              measure1
7          measure7              measure1
8          measure2              measure2
9          measure2              measure3
10         ... and so on, detailing every combination of the 7 variables  

Каждый показатель относится к вектору в другом фрейме данных.Например, longdata $ measure1.

Например, для ссылки на longdat $ measure1 я могу использовать следующий код:

eval(parse(text = paste("longdat$",list.paired[1,1], sep =""))

Я хотел бы создать цикл, который выполняет корреляцию междукаждая комбинация list.paired, где она ссылается на данные, хранящиеся в longdat.Например:

x = eval(parse(text = paste("longdat$",list.paired[2,1],".long", sep =""))) #longdat$measure2
y = eval(parse(text = paste("longdat$",list.paired[2,2],".long", sep =""))) #longdat$measure1
cor(x, y)

Мне до сих пор не удавалось создать цикл для этого, который будет циклически проходить по каждой паре переменных в list.paired.Буду очень признателен за любые предложения.

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Я думаю, что этот подход имеет большую избыточность, потому что cor (measure1, measure2) совпадает с cor (measure2, measure1), а cor (measure1, measure1) равен 1. В действительности у вас есть только 21 уникальная комбинация ((7 выбирают 2)).

Может ли этот подход работать?

 # your long data
 df<- data.frame(col1 = runif(100),col2 = runif(100),col3 = runif(100),col4 = 
 runif(100),col5 = runif(100),col6 = runif(100),col7 = runif(100))

 # your vector with correlations between unique combinations of columns
 cor.vec <- apply(combn(7,2), 2, function(idx) cor(df[,idx[1]],df[,idx[2]]))
0 голосов
/ 25 мая 2018

Предполагая следующие фреймы данных:

list.paired <- data_frame(
  Var1 = str_c("measure", rep(1:3, each = 3)),
  Var2 = str_c("measure", rep(1:3, 3))
)

longdat <- data_frame(
  measure1 = rnorm(10),
  measure2 = rnorm(10),
  measure3 = rnorm(10)
)

Параметр цикла может быть следующим:

results <- list()
for (v1 in list.paired$Var1)
  for (v2 in list.paired$Var2) {
    results <- c(results, cor(longdat[v1], longdat[v2]))
    names(results[[length(results)]]) <- paste(v1, "*", v2)
  }

Или с использованием пакета purrr (mapply может сделать то же самое):

purrr:pmap(
  list.paired,
  function(Var1, Var2) {
    res <- cor(longdat[[Var1]], longdat[[Var2]])
    names(res) <- paste(Var1, "*", Var2)
    return(res)
  }
)

Но, может быть, все, что вам нужно, это просто cor(longdat)?

0 голосов
/ 25 мая 2018

Вы можете использовать вложенный цикл for:

for (vm1 in list.paired$Var1) {
    for(vm2 in list.paired$Var2) {
        x = eval(parse(text = paste("longdat$",vm1,".long", sep =""))) #longdat$measure2
        y = eval(parse(text = paste("longdat$",vm2,".long", sep =""))) #longdat$measure1
        cor(x, y)
    }
}

Это будет довольно медленно.Более быстрый способ будет cbind ваши векторы в две отдельные матрицы m1 и m2, а затем запустить cor(m1,m2).Согласно документации из cor: Если x и y - матрицы, то вычисляются ковариации (или корреляции) между столбцами x и столбцами y.

...