Come generare una matrice di correlazione casuale che ha voci fuori diagonale distribuite approssimativamente normalmente con una deviazione standard determinata?


11

Vorrei generare una matrice di correlazione casuale in modo tale che la distribuzione dei suoi elementi off-diagonali appaia approssimativamente normale. Come posso farlo?

La motivazione è questa. Per un insieme di dati di serie temporali, la distribuzione di correlazione sembra spesso abbastanza vicina alla normalità. Vorrei generare molte matrici di correlazione "normali" per rappresentare la situazione generale e usarle per calcolare il numero di rischio.n


Conosco un metodo, ma la deviazione standard risultante (della distribuzione degli elementi off-diagonali) è troppo piccola per il mio scopo: generare righe casuali uniformi o normali di una matrice , standardizzare le righe (sottrarre la media, dividere per deviazione standard), quindi la matrice di correlazione del campione ha normalmente distribuito voci off-diagonali [ Aggiornamento dopo i commenti: la deviazione standard sarà ].X 1nX1n1XXn1/2

Qualcuno può suggerire un metodo migliore con il quale posso controllare la deviazione standard?


1
@Richard, grazie per la tua domanda. Sfortunatamente, il metodo descritto sopra non produrrà voci normalmente distribuite. Le diagonali sono 1 con probabilità una e le off-diagonali sono delimitate tra e . Ora, le voci riscalate convergeranno asintoticamente in una distribuzione normale centrata attorno a zero. Puoi fornirci ulteriori informazioni sul problema che stai effettivamente cercando di risolvere? E perché vuoi "normalmente distribuito" dalle diagonali? + 11+1
cardinale

1
@Richard, quello che voglio dire era, supponiamo che e siano due vettori indipendenti in modo tale che le voci di ciascuna siano nella normale norma. Calcola ; cioè, la correlazione campionaria tra e . Quindi converge nella distribuzione in una normale variabile casuale standard. Per "riscalato" intendevo la moltiplicazione per che è ciò che è necessario per ottenere una distribuzione limitante non degenerata. Y = ( Y 1 , Y 2 ,X=(X1,X2,,Xn)ρ n = s x y / ( s x s y ) X Y n 1 / 2 ρ n n 1 / 2Y=(Y1,Y2,,Yn)ρ^n=sxy/(sxsy)XYn1/2ρ^nn1/2
cardinale

1
@Richard, l'essenza del "problema" è che facendo due restrizioni (a) che le norme di ogni riga sono 1 e (b) che le voci sono generate da un campione casuale, stai necessariamente forzando le correlazioni ad essere piuttosto piccolo (nell'ordine di . Il motivo è che non è possibile avere correlazioni arbitrariamente grandi tra le righe e ottenere comunque le norme di ciascuna riga in modo da essere 1 in presenza di tanta indipendenza.n1/2
Cardinale

1
... ora, puoi ottenere correlazioni più grandi in termini di grandezza correlando prima le righe tra loro prima di rinormalizzare. Ma essenzialmente hai solo un parametro con cui giocare, quindi sia la media asintotica che la varianza saranno legate a quel parametro. Quindi, probabilmente questo non ti darà nemmeno la flessibilità che sembri desiderare.
cardinale

1
Certo, prendiamo un caso semplice. Chiama la matrice generatrice , che assumeremo essere senza perdita di generalità. Ora, genera le colonne di come vettori iid in modo tale che gli elementi di ciascun vettore siano normali variabili casuali standard che sono correlate alla correlazione . Ora usa la procedura che hai seguito. Let denota la correlazione campionaria tra esima e esima riga * * di . Quindi per fisso , lasciando ,m × n X ρ ρ i j i j X m n n 1 / 2 ( ρ i j - ρXm×nXρρ^ijijXmnN ( 0 , ( 1 - ρ 2 ) 2 )n1/2(ρ^ijρ)converge nella distribuzione in una variabile casuale . N(0,(1ρ2)2)
cardinale

Risposte:


5

Ho prima fornito quella che ora credo sia una risposta non ottimale; quindi ho modificato la mia risposta per iniziare con un suggerimento migliore.


Usando il metodo della vite

In questo thread: come generare in modo efficiente matrici di correlazione semidefinite positive casuali? - Ho descritto e fornito il codice per due algoritmi efficienti di generazione di matrici di correlazione casuali. Entrambi provengono da un articolo di Lewandowski, Kurowicka e Joe (2009).

Si prega di vedere la mia risposta lì per un sacco di cifre e codice matlab. Qui vorrei solo dire che il metodo vine consente di generare matrici di correlazione casuali con qualsiasi distribuzione di correlazioni parziali (si noti la parola "parziale") e può essere utilizzato per generare matrici di correlazione con grandi valori off-diagonali. Ecco la figura rilevante di quel thread:

Metodo della vite

L'unica cosa che cambia tra le sottotrame, è un parametro che controlla quanto la distribuzione delle correlazioni parziali sia concentrata attorno a . Dato che OP stava chiedendo una distribuzione approssimativamente normale fuori diagonale, ecco la trama con istogrammi degli elementi fuori diagonale (per le stesse matrici di cui sopra):±1

Elementi fuori diagonale

Penso che queste distribuzioni siano ragionevolmente "normali", e si può vedere come aumenta gradualmente la deviazione standard. Dovrei aggiungere che l'algoritmo è molto veloce. Vedi thread collegato per i dettagli.


La mia risposta originale

Una modifica diretta del tuo metodo potrebbe fare il trucco (a seconda di quanto vuoi che la distribuzione sia normale). Questa risposta è stata ispirata dai commenti di @ cardinal sopra e dalla risposta di @ psarka alla mia domanda Come generare una matrice di correlazione casuale a pieno titolo con alcune forti correlazioni presenti?

Il trucco è rendere i campioni del tuo correlati (non caratteristiche, ma campioni). Ecco un esempio: ho generato una matrice casuale di dimensioni (tutti gli elementi dalla norma normale), quindi aggiungo un numero casuale da a ciascuna riga, per . Per la matrice di correlazione (dopo aver standardizzato le caratteristiche) avrà elementi off-diagonali approssimativamente distribuiti normalmente con deviazione standard . PerX 1000 × 100 [ - a / 2 , a / 2 ] a = 0 , 1 , 2 , 5 a = 0 XX 1 / XX1000×100[a/2,a/2]a=0,1,2,5a=0XX a>0aa=0,1,2,51/1000a>0, Computo la matrice di correlazione senza centrare le variabili (ciò preserva le correlazioni inserite) e la deviazione standard degli elementi off-diagonali cresce con come mostrato in questa figura (le righe corrispondono a ):aa=0,1,2,5

matrici di correlazione casuali

Tutte queste matrici sono ovviamente definite positive. Ecco il codice matlab:

offsets = [0 1 2 5];
n = 1000;
p = 100;

rng(42) %// random seed

figure
for offset = 1:length(offsets)
    X = randn(n,p);
    for i=1:p
        X(:,i) = X(:,i) + (rand-0.5) * offsets(offset);
    end
    C = 1/(n-1)*transpose(X)*X; %// covariance matrix (non-centred!)

    %// convert to correlation
    d = diag(C);
    C = diag(1./sqrt(d))*C*diag(1./sqrt(d));

    %// displaying C
    subplot(length(offsets),3,(offset-1)*3+1)
    imagesc(C, [-1 1])

    %// histogram of the off-diagonal elements
    subplot(length(offsets),3,(offset-1)*3+2)
    offd = C(logical(ones(size(C))-eye(size(C))));
    hist(offd)
    xlim([-1 1])

    %// QQ-plot to check the normality
    subplot(length(offsets),3,(offset-1)*3+3)
    qqplot(offd)

    %// eigenvalues
    eigv = eig(C);
    display([num2str(min(eigv),2) ' ... ' num2str(max(eigv),2)])
end

L'output di questo codice (autovalori minimo e massimo) è:

0.51 ... 1.7
0.44 ... 8.6
0.32 ... 22
0.1 ... 48

puoi tracciare il valore degli autovalori più piccoli che ottieni usando questo metodo insieme ai tuoi grafici?
user603

1
Senza cambiare la figura, posso semplicemente scrivere qui che gli autovalori più piccoli sono rispettivamente 0,5, 0,4, 0,3 e 0,1 (per ogni riga della mia figura). I più grandi crescono dall'1.7 al 48.
ameba afferma Reinstate Monica il

ma sono questi gli autovalori della matrice di correlazione o quelli di X'X ?.
user603

C

Non penso sia impossibile, non riuscivo a vederlo dal codice (non ho usato matlab per anni a questo punto)
user603


1

Se si sta tentando di generare matrici di correlazione casuali, prendere in considerazione il campionamento dalla distribuzione di Wishart. Questa domanda che segue fornisce informazioni sulla distribuzione di Wishart e consigli su come campionare: Come generare in modo efficiente matrici di correlazione semidefinite positive casuali?


Ma si può controllare la deviazione standard degli elementi off-diagonali risultanti con i parametri della distribuzione di Wishart? Se é cosi, come?
ameba dice di reintegrare Monica il

1

Questa non è una risposta molto sofisticata, ma non posso fare a meno di pensare che sia ancora una buona risposta ...

Se la tua motivazione è che i parametri di correlazione prodotti dai dati delle serie temporali tendono ad apparire normali, perché non semplicemente simulare i dati delle serie temporali, calcolare i parametri di correlazione e usarli?

Potresti avere una buona ragione per non farlo, ma non mi è chiaro dalla tua domanda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.