I felt like doing some programming, so I took @Adam's deleted answer and decided to write a nice implementation in R. I focus on using a functionally oriented style (i.e. lapply style looping). The general idea is to take two vectors, randomly permute one of the vectors until a certain correlation has been reached between them. This approach is very brute-force, but is simple to implement.
First we create a function that randomly permutes the input vector:
randomly_permute = function(vec) vec[sample.int(length(vec))]
randomly_permute(1:100)
[1] 71 34 8 98 3 86 28 37 5 47 88 35 43 100 68 58 67 82
[19] 13 9 61 10 94 29 81 63 14 48 76 6 78 91 74 69 18 12
[37] 1 97 49 66 44 40 65 59 31 54 90 36 41 93 24 11 77 85
[55] 32 79 84 15 89 45 53 22 17 16 92 55 83 42 96 72 21 95
[73] 33 20 87 60 38 7 4 52 27 2 80 99 26 70 50 75 57 19
[91] 73 62 23 25 64 51 30 46 56 39
...and create some example data
vec1 = runif(100)
vec2 = runif(100)
...write a function that permutes the input vector, and correlates it to a reference vector:
permute_and_correlate = function(vec, reference_vec) {
perm_vec = randomly_permute(vec)
cor_value = cor(perm_vec, reference_vec)
return(list(vec = perm_vec, cor = cor_value))
}
permute_and_correlate(vec2, vec1)
$vec
[1] 0.79072381 0.23440845 0.35554970 0.95114398 0.77785348 0.74418811
[7] 0.47871491 0.55981826 0.08801319 0.35698405 0.52140366 0.73996913
[13] 0.67369873 0.85240338 0.57461506 0.14830718 0.40796732 0.67532970
[19] 0.71901990 0.52031017 0.41357545 0.91780357 0.82437619 0.89799621
[25] 0.07077250 0.12056045 0.46456652 0.21050067 0.30868672 0.55623242
[31] 0.84776853 0.57217746 0.08626022 0.71740151 0.87959539 0.82931652
[37] 0.93903143 0.74439384 0.25931398 0.99006038 0.08939812 0.69356590
[43] 0.29254936 0.02674156 0.77182339 0.30047034 0.91790830 0.45862163
[49] 0.27077191 0.74445997 0.34622648 0.58727094 0.92285322 0.83244284
[55] 0.61397396 0.40616274 0.32203732 0.84003379 0.81109473 0.50573325
[61] 0.86719899 0.45393971 0.19701975 0.63877904 0.11796154 0.26986325
[67] 0.01581969 0.52571331 0.27087693 0.33821824 0.52590383 0.11261002
[73] 0.89840404 0.82685046 0.83349287 0.46724807 0.15345334 0.60854785
[79] 0.78854984 0.95770015 0.89193212 0.18885955 0.34303707 0.87332019
[85] 0.08890968 0.22376395 0.02641979 0.43377516 0.58667068 0.22736077
[91] 0.75948043 0.49734797 0.25235660 0.40125309 0.72147500 0.92423638
[97] 0.27980561 0.71627101 0.07729027 0.05244047
$cor
[1] 0.1037542
...and iterate a thousand times:
n_iterations = lapply(1:1000, function(x) permute_and_correlate(vec2, vec1))
...and find the maximum correlation:
cor_values = sapply(n_iterations, '[[', 'cor')
n_iterations[[which.max(cor_values)]]
$vec
[1] 0.89799621 0.67532970 0.46456652 0.75948043 0.30868672 0.83244284
[7] 0.86719899 0.55623242 0.63877904 0.73996913 0.71901990 0.85240338
[13] 0.81109473 0.52571331 0.82931652 0.60854785 0.19701975 0.26986325
[19] 0.58667068 0.52140366 0.40796732 0.22736077 0.74445997 0.40125309
[25] 0.89193212 0.52031017 0.92285322 0.91790830 0.91780357 0.49734797
[31] 0.07729027 0.11796154 0.69356590 0.95770015 0.74418811 0.43377516
[37] 0.55981826 0.93903143 0.30047034 0.84776853 0.32203732 0.25235660
[43] 0.79072381 0.58727094 0.99006038 0.01581969 0.41357545 0.52590383
[49] 0.27980561 0.50573325 0.92423638 0.11261002 0.89840404 0.15345334
[55] 0.61397396 0.27077191 0.12056045 0.45862163 0.18885955 0.77785348
[61] 0.23440845 0.05244047 0.25931398 0.57217746 0.35554970 0.34622648
[67] 0.21050067 0.08890968 0.84003379 0.95114398 0.83349287 0.82437619
[73] 0.46724807 0.02641979 0.71740151 0.74439384 0.14830718 0.82685046
[79] 0.33821824 0.71627101 0.77182339 0.72147500 0.08801319 0.08626022
[85] 0.87332019 0.34303707 0.45393971 0.47871491 0.29254936 0.08939812
[91] 0.35698405 0.67369873 0.27087693 0.78854984 0.87959539 0.22376395
[97] 0.02674156 0.07077250 0.57461506 0.40616274
$cor
[1] 0.3166681
...or find the closest value to a correlation of 0.2:
n_iterations[[which.min(abs(cor_values - 0.2))]]
$vec
[1] 0.02641979 0.49734797 0.32203732 0.95770015 0.82931652 0.52571331
[7] 0.25931398 0.30047034 0.55981826 0.08801319 0.29254936 0.23440845
[13] 0.12056045 0.89799621 0.57461506 0.99006038 0.27077191 0.08626022
[19] 0.14830718 0.45393971 0.22376395 0.89840404 0.08890968 0.15345334
[25] 0.87332019 0.92285322 0.50573325 0.40796732 0.91780357 0.57217746
[31] 0.52590383 0.84003379 0.52031017 0.67532970 0.83244284 0.95114398
[37] 0.81109473 0.35554970 0.92423638 0.83349287 0.34622648 0.18885955
[43] 0.61397396 0.89193212 0.74445997 0.46724807 0.72147500 0.33821824
[49] 0.71740151 0.75948043 0.52140366 0.69356590 0.41357545 0.21050067
[55] 0.87959539 0.11796154 0.73996913 0.30868672 0.47871491 0.63877904
[61] 0.22736077 0.40125309 0.02674156 0.26986325 0.43377516 0.07077250
[67] 0.79072381 0.08939812 0.86719899 0.55623242 0.60854785 0.71627101
[73] 0.40616274 0.35698405 0.67369873 0.82437619 0.27980561 0.77182339
[79] 0.19701975 0.82685046 0.74418811 0.58667068 0.93903143 0.74439384
[85] 0.46456652 0.85240338 0.34303707 0.45862163 0.91790830 0.84776853
[91] 0.78854984 0.05244047 0.58727094 0.77785348 0.01581969 0.27087693
[97] 0.07729027 0.71901990 0.25235660 0.11261002
$cor
[1] 0.2000199
To get a higher correlation, you need to increase the number of iterations.