Tika Ram Gurung
Tika Ram Gurung

Reputation: 179

correlation with multiple variables and its mutiple combination

Here is the example of the data set to be calculated the correlation between O_data and possible multiple combinations of M_data.

O_data=runif(10)
M_a=runif(10)
M_b=runif(10)
M_c=runif(10)
M_d=runif(10)
M_e=runif(10)
M_data=data.frame(M_a,M_b,M_c,M_d,M_e)

I can calculate the correlation between O_data and individual M_data data.

correlation= matrix(NA,ncol = length(M_data[1,]))

for (i in 1:length(correlation))
{
  correlation[,i]=cor(O_data,M_data[,i])
}

In addition to this, how can I get the correlation between O_data and possible multiple combinations of M_data set?

let's clarify the combination.

cor_M_ab=cor((M_a+M_b),O_data)
cor_M_abc=cor((M_a+M_b+M_c),O_data)
cor_M_abcd=...
cor_M_abcde=...
...
....
cor_M_bcd=..
..
cor_M_eab=...
....
...

I don't want combinations of M_a and M_c, I want the combination on a continuous basis, like, M_ab, or bc,bcd,abcde,ea,eab........

Upvotes: 0

Views: 208

Answers (1)

ngm
ngm

Reputation: 2589

Generate the data using set.seed so you can reproduce:

set.seed(42)  
O_data=runif(10)
M_a=runif(10)
M_b=runif(10)
M_c=runif(10)
M_d=runif(10)
M_e=runif(10)
M_data=data.frame(M_a,M_b,M_c,M_d,M_e)

The tricky part is just keeping things organized. Since you didn't specify, I made a matrix with 5 rows and 31 columns. The rows get the names of the variables in your M_data. Here's the matrix (motivated by: All N Combinations of All Subsets)

M_grid <- t(do.call(expand.grid, replicate(5, 0:1, simplify = FALSE))[-1,])
rownames(M_grid) <- names(M_data)                                          
M_grid                                                                     
#>     2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#> M_a 1 0 1 0 1 0 1 0  1  0  1  0  1  0  1  0  1  0  1  0  1  0  1  0  1  0
#> M_b 0 1 1 0 0 1 1 0  0  1  1  0  0  1  1  0  0  1  1  0  0  1  1  0  0  1
#> M_c 0 0 0 1 1 1 1 0  0  0  0  1  1  1  1  0  0  0  0  1  1  1  1  0  0  0
#> M_d 0 0 0 0 0 0 0 1  1  1  1  1  1  1  1  0  0  0  0  0  0  0  0  1  1  1
#> M_e 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  1  1  1  1  1  1  1  1  1  1  1
#>     28 29 30 31 32
#> M_a  1  0  1  0  1
#> M_b  1  0  0  1  1
#> M_c  0  1  1  1  1
#> M_d  1  1  1  1  1
#> M_e  1  1  1  1  1

Now when I do a matrix multiplication of M_data and any column of my M_grid I get a sum of the columns in M_data corresponding to which rows of M_grid have 1's. For example:

as.matrix(M_data) %*% M_grid[,4]

gives me the sum of M_a and M_b. I can calculate the correlation between O_data and any of these sums. Putting it all together in one line:

(final <- cbind(t(M_grid), apply(as.matrix(M_data) %*% M_grid, 2, function(x) cor(O_data, x))))
#>    M_a M_b M_c M_d M_e             
#> 2    1   0   0   0   0  0.066499681
#> 3    0   1   0   0   0 -0.343839423
#> 4    1   1   0   0   0 -0.255957896
#> 5    0   0   1   0   0  0.381614222
#> 6    1   0   1   0   0  0.334916617
#> 7    0   1   1   0   0  0.024198743
#> 8    1   1   1   0   0  0.059297654
#> 9    0   0   0   1   0  0.180676146
#> 10   1   0   0   1   0  0.190656099
#> 11   0   1   0   1   0 -0.140666930
#> 12   1   1   0   1   0 -0.094245439
#> 13   0   0   1   1   0  0.363591787
#> 14   1   0   1   1   0  0.363546012
#> 15   0   1   1   1   0  0.111435827
#> 16   1   1   1   1   0  0.142772457
#> 17   0   0   0   0   1  0.248640472
#> 18   1   0   0   0   1  0.178471959
#> 19   0   1   0   0   1 -0.117930168
#> 20   1   1   0   0   1 -0.064838097
#> 21   0   0   1   0   1  0.404258155
#> 22   1   0   1   0   1  0.348609692
#> 23   0   1   1   0   1  0.114267433
#> 24   1   1   1   0   1  0.131731971
#> 25   0   0   0   1   1  0.241561478
#> 26   1   0   0   1   1  0.229693510
#> 27   0   1   0   1   1  0.001390233
#> 28   1   1   0   1   1  0.030884234
#> 29   0   0   1   1   1  0.369212761
#> 30   1   0   1   1   1  0.354971839
#> 31   0   1   1   1   1  0.166132390
#> 32   1   1   1   1   1  0.182368955

The final column is the correlation of O_data with all 31 possible sums of columns in M_data. You can tell which column is included by seeing which has a 1 under it for that row.

I try not to resort to matrices too much but this was the first thing I thought of.

Upvotes: 1

Related Questions