Abstract
You can generate correlated random variables easily with a Cholesky (pronounce “koleski”) decomposition. I present a simple example here. For the better Iman Conover approach look here.
Appendix – Cholesky Code
Please read my Disclaimer.
Option Explicit
Function Cholesky(r As Range) As Variant
'I suggest to use the Cholesky decomposition just for purposes of demonstration.
'Better options are (in this order): tred2, tqli, eigsrt from Numerical Recipes.
'SVD also works but is computationally more expensive by far since it does not
'make use of symmetry. (Thanks to Glen R.)
'Source (EN): http://www.sulprobil.de/cholesky_en/
'Source (DE): http://www.berndplumhoff.de/cholesky_de/
'Bernd Plumhoff 22-Nov-2019 PB V1.0
Dim vA As Variant
Dim d As Double
Dim i As Long, j As Long, k As Long, n As Long
vA = r
n = r.Rows.Count
If n <> r.Columns.Count Then
Cholesky = CVErr(xlErrRef)
Exit Function
End If
ReDim vR(1 To n, 1 To n) As Variant
For j = 1 To n
d = 0#
For k = 1 To j - 1
d = d + vR(j, k) * vR(j, k)
Next k
vR(j, j) = vA(j, j) - d
If vR(j, j) > 0# Then
vR(j, j) = Sqr(vR(j, j))
For i = j + 1 To n
d = 0#
For k = 1 To j - 1
d = d + vR(i, k) * vR(j, k)
Next k
vR(i, j) = (vA(i, j) - d) / vR(j, j)
Next i
Else
'Cannot continue with usual Cholesky
'Fill this column with zeros. Idea: Glen R.
For i = j To n
vR(i, j) = 0#
Next i
End If
Next j
Cholesky = vR
End Function
Download
Please read my Disclaimer.
Cholesky.xlsm [169 KB Excel file, open and use at your own risk]