# [R] lognormal sampleing using covariance matrix

Keith S Weintraub kw1958 at gmail.com
Tue Apr 2 15:32:18 CEST 2013

Andras,
I am no expert but you could start with correlated normal random variables and then convert to lognormal.

You can use rmvsnorm from the {fCopulae} package to generate the correlated normals.

Here is a call that I have used in the past:

set.seed(12345)
numSims<-10 # number of multivariate simulations
nVars<-3 # number of variables per simulation
sd<-.3 # Standard deviation
corrMatrix<-matrix(c(1,.2, .1, .2, 1, .2, .1, .2, 1), nrow = 3)  # Correlation matrix
sims<-rmvsnorm(numSims, dim=nVars, Omega=corrMatrix*sd^2)
sims

1            2           3
1   0.17565865  0.000961992  0.23987213
2   0.21283981  0.576746426  0.54851754
3  -0.03279099  0.102383699 -0.17187533
4  -0.13604915  0.125701955 -0.44056873
5   0.18176624 -0.184257203 -0.49189846
6  -0.54538679  0.131041175  0.52003437
7   0.18902957 -0.222728926 -0.17124538
8  -0.08285523 -0.114034555  0.15543724
9  -0.08524792  0.312371313  0.23281669
10 -0.27579660  0.032647156 -0.05873216
attr(,"parameters")
attr(,"parameters")\$xi
[1] 0 0 0

attr(,"parameters")\$Omega
[,1]  [,2]  [,3]
[1,] 0.090 0.018 0.009
[2,] 0.018 0.090 0.018
[3,] 0.009 0.018 0.090

attr(,"parameters")\$alpha
[1] 0 0 0

Note that in my example above the mean is 0 but can be changed using the "mu" parameter. See the docs for fCopulae.

http://en.wikipedia.org/wiki/Log-normal_distribution

Good luck,
KW

> Dear All,
>
> wondering if someine can access the link to the randsamp code referenced in the R-help archive here: http://www.mail-archive.com/r-help@stat.math.ethz.ch/msg75645.html ? I have tried but for whatever reason I can not get trough. My problem seems to be similar to what the author originally described there, so having access to it would be great. Else, if you have any thougths on sampling from a distribution assumed to be log-normal with expected means + SD of
>
> a=5.04  + 0.56
> b=1.89 + 0.19
> c=0.43  + 0.08
> d=0.44  + 0.07
>
> and covariance matrix of:
>
>        a                    b                       c                    d
> a   0.31
> b   0.015              0.04
> c  -0.019           0.000007            0.0064
> d  0.0069           -0.0069             -0.000067         0.0048
>
> would be greatly appreciated. Can this be done with a function?I been working on this for months now but can not crack it. I can not find a package that has a function to deal with this. thanks,
>
> Andras

--