Esiste un metodo molto semplice per simulare dalla copula gaussiana che si basa sulle definizioni della distribuzione normale multivariata e della copula di Gauss.
Inizierò fornendo la definizione e le proprietà richieste della distribuzione normale multivariata, seguita dalla copula gaussiana, quindi fornirò l'algoritmo per simulare dalla copula di Gauss.
Multivariata distribuzione normale
Un vettore casuale ha una distribuzione normale multivariata se
X d = μ + A Z ,
dove Z è un k -dimensionale vettore di variabili casuali normali standard indipendente, μ è un d dimensionale vettore di costanti, e a è un d × k matrice di costanti. La notazione d =X=(X1,…,Xd)′
X=dμ+AZ,
ZkμdAd×k=ddenota l'uguaglianza nella distribuzione. Quindi, ogni componente di
è essenzialmente una somma ponderata di variabili casuali normali standard indipendenti.
Dalle proprietà dei vettori medi e delle matrici di covarianza, abbiamo
E ( X ) = μ e
c o v ( X ) = Σ , con
Σ = A A ′ , che porta alla notazione naturale
X ∼ N d ( μ , Σ )XE(X)=μcov(X)=ΣΣ=AA′X∼Nd(μ,Σ) .
Copula di Gauss
La copula di Gauss è definita implicitamente dalla distribuzione normale multivariata, ovvero la copula di Gauss è la copula associata a una distribuzione normale multivariata. In particolare, dal teorema di Sklar la copula di Gauss è
dove Φ
CP(u1,…,ud)=ΦP(Φ−1(u1),…,Φ−1(ud)),
Φdenota la funzione di distribuzione normale standard e
indica la funzione di distribuzione normale standard multivariata con matrice di correlazione P. Quindi, la copula di Gauss è semplicemente una distribuzione normale multivariata standard in cui la
trasformazione integrale di probabilità viene applicata a ciascun margine.
ΦP
Algoritmo di simulazione
Alla luce di quanto sopra, un approccio naturale per simulare dalla copula di Gauss è simulare dalla distribuzione normale standard multivariata con una matrice di correlazione appropriata e convertire ciascun margine usando la trasformazione integrale di probabilità con la funzione di distribuzione normale standard. Mentre si simula da una distribuzione normale multivariata con matrice di covarianza Σ si riduce essenzialmente a fare una somma ponderata di variabili casuali normali standard indipendenti, in cui la matrice "peso" A può essere ottenuta dalla decomposizione di Cholesky della matrice di covarianza Σ .PΣUNΣ
Pertanto, un algoritmo per simulare campioni dalla copula di Gauss con matrice di correlazione P è:nP
- Esegui una decomposizione Cholesky di e imposta A come matrice triangolare inferiore risultante.PUN
- Ripeti i seguenti passaggi volte.
n
- Genera un vettore di variate normali standard indipendenti.Z=(Z1,…,Zd)′
- Impostare X=AZ
- Restituisce .U=(Φ(X1),…,Φ(Xd))′
Il seguente codice in un'implementazione di esempio di questo algoritmo utilizzando R:
## Initialization and parameters
set.seed(123)
P <- matrix(c(1, 0.1, 0.8, # Correlation matrix
0.1, 1, 0.4,
0.8, 0.4, 1), nrow = 3)
d <- nrow(P) # Dimension
n <- 200 # Number of samples
## Simulation (non-vectorized version)
A <- t(chol(P))
U <- matrix(nrow = n, ncol = d)
for (i in 1:n){
Z <- rnorm(d)
X <- A%*%Z
U[i, ] <- pnorm(X)
}
## Simulation (compact vectorized version)
U <- pnorm(matrix(rnorm(n*d), ncol = d) %*% chol(P))
## Visualization
pairs(U, pch = 16,
labels = sapply(1:d, function(i){as.expression(substitute(U[k], list(k = i)))}))
La seguente tabella mostra i dati risultanti dal codice R sopra.