Aquí está el enfoque general que puedes seguir para generar dos variables aleatorias correlacionadas. Supongamos que, X e Y son dos variables aleatorias, tales que: $$X \sim N(\mu_1, \sigma_1^2)$$ $$Y \sim N(\mu_2, \sigma_2^2)$$ y $$cor(X,Y)=\rho$$ Ahora considere: $y=bx + e_i$ , donde $x$ $(=\frac{X-\mu_1}{\sigma_1}$ ) y $y$ $(=\frac{Y-\mu_2}{\sigma_2}$ ) siguen ambos una distribución normal estándar , tal que $cor(x,y)=\rho. $ Para la variante normal estándar, $b= \rho$ . Así que tenemos:
$$y=\rho x + e_i$$
Ahora, aquí está el algoritmo, usted puede seguir:
1) Generar $n$ Variable normal estándar para $x$ .
2) Desde, $e_i \sim N(0, 1-\rho^2)$ . Así que genera $n$ Variable normal como $e_i$ de una distribución normal con media 0 y varianza $1-\rho^2$ .
3) Obtenga $y=\rho x + e_i$ .
4) Convierta sus números normales en normales (recuerde que la correlación es independiente del cambio de origen y escala)
Código R para simular el GBM correlacionado:
corGBM <- function(n, r, t=1/365, plot=TRUE) {
#n is number of samples
#r is correlation
#t is tick step
x <- rnorm(n, mean=0, sd= 1)
se <- sqrt(1 - r^2) #standard deviation of error
e <- rnorm(n, mean=0, sd=se)
y <- r*x + e
X <- cumsum(x* sqrt(t))
Y <- cumsum(y* sqrt(t))
Max <- max(c(X,Y))
Min <- min(c(X,Y))
if(plot) {
plot(X, type="l", ylim=c(Min, Max))
lines(Y, col="blue")
}
return(cor(x,y))
}
#sample result
corGBM(10000,.85)
[1] 0.8523341