Generazione di dati con una data matrice di covarianza campione


22

Data una matrice di covarianza Σs , come generare dati in modo tale da avere la matrice di covarianza di esempio Σ^=Σs ?


Più in generale: siamo spesso interessati a generare dati da una densità f(x|θ) , con i dati x dati alcuni parametri vettoriali θ . Ciò si traduce in un campione, dal quale potremmo quindi stimare nuovamente un valore θ^ . Quello che mi interessa è il problema inverso: cosa succede se ci viene fornito un set di parametri θs e vorremmo generare un esempio x tale, che θ^=θs .

È un problema noto? Un tale metodo è utile? Sono disponibili algoritmi?


Una soluzione scalabile è fornita da Attilio Meucci. Vedi questo articolo di rischio e il codice matlab
Peter Cotton

Risposte:


16

Esistono due diverse situazioni tipiche per questo tipo di problemi:

i) vuoi generare un campione da una data distribuzione le cui caratteristiche di popolazione corrispondono a quelle specificate (ma a causa della variazione del campionamento, non hai le caratteristiche del campione esattamente corrispondenti).

ii) si desidera generare un campione le cui caratteristiche del campione corrispondano a quelle specificate (ma, a causa dei vincoli della corrispondenza esatta delle quantità del campione con un set di valori prespecificato, non provengono realmente dalla distribuzione desiderata).

Vuoi il secondo caso, ma lo ottieni seguendo lo stesso approccio del primo caso, con un ulteriore passaggio di standardizzazione.

Quindi, per le normali multivariate, entrambe possono essere eseguite in modo abbastanza semplice:

Con il primo caso potresti usare normali casuali senza la struttura della popolazione (come il normale standard che ha aspettativa 0 e matrice di covarianza di identità) e quindi imporlo - trasformalo per ottenere la matrice di covarianza e significa che vuoi. Se e sono la media della popolazione e la covarianza di cui hai bisogno e sono lo standard normale, calcoli , per alcune cui (ad esempio una adatta potrebbe essere ottenuta tramite decomposizione di Cholesky) . Quindi ha le caratteristiche di popolazione desiderate.Σ z y = L z + μ L L L = Σ L yμΣzy=Lz+μLLL=ΣLy

Con il secondo, devi prima trasformare le tue normali casuali per rimuovere anche la variazione casuale dalla media zero e dalla covarianza identità (rendendo la media campione zero e la covarianza campione ), quindi procedere come prima. Ma quella fase iniziale di rimozione della deviazione del campione dalla media esatta , la varianza interferisce con la distribuzione. (In piccoli campioni può essere piuttosto grave.) 0 IIn0I

Questo può essere fatto sottraendo la media campionaria di ( ) e calcolando la decomposizione di Cholesky di . Se è il fattore Cholesky sinistro, allora dovrebbe avere la media campionaria 0 e la covarianza del campione di identità. È quindi possibile calcolare e disporre di un campione con i momenti di campionamento desiderati. (A seconda di come sono definite le quantità del campione, potrebbe esserci un piccolo violino coinvolto nella moltiplicazione / divisione per fattori come , ma è abbastanza facile identificare tale esigenza.)z = z - ˉ z z L z ( 0 ) = ( L ) - 1 z y = L z ( 0 ) + μ zz=zz¯zLz(0)=(L)1zy=Lz(0)+μn1n


1
+1. L'altro giorno, avevo bisogno di generare alcuni dati con una data matrice di covarianza di esempio, non sapevo come farlo e per qualche motivo mi ci è voluto molto tempo per trovare la tua risposta. Per aumentare la visibilità di questa discussione e illustrare i tuoi suggerimenti, ho pubblicato un'altra risposta qui con un codice Matlab.
ameba dice di reintegrare Monica il

@amoeba Mi chiedo se c'è la possibilità di mettere uno dei termini di ricerca che hai usato che non sono già presenti qui nei tag della domanda (o eventualmente inserirne diversi in una piccola modifica nel testo della domanda, che dovrebbe comunque aiutare a trovarlo ). Ora mi chiedo se dovrei fare la stessa cosa in R ... ma poi va meglio nella mia risposta o come aggiunta alla tua?
Glen_b -Restate Monica

1
Ho già preso la libertà di modificare la domanda e ho anche cercato di formulare la mia risposta in modo che includa quante più parole chiave possibili. Spero che questo possa aiutare. Sono stato sorpreso, a proposito, che questo semplice suggerimento (sbiancamento dei dati generati prima di trasformarsi nella covarianza richiesta) fosse così difficile da google; non sono riuscito a trovare nulla (su CV o altrove) fino a quando ho finalmente trovato la tua risposta.
ameba dice di reintegrare Monica il

1
@amoeba Oh, ok, grazie. Sì, in realtà, non posso dire di ricordare di averlo mai visto menzionato da nessuna parte per il caso multivariato (senza dubbio è stato, dal momento che è un'idea abbastanza ovvia, soprattutto se ci hai già pensato per il caso univariato, o hai già visto nel caso univariato).
Glen_b -Restate Monica

@Glen_b Come dici tu, la distribuzione risultante di questi campioni "ripuliti" non può essere normale. Hai idea di quale potrebbe essere la distribuzione risultante? O forse se è uguale / non uguale alla distribuzione condizionaleZz¯=μ,Cov(z)=Σ
gg

17

@Glen_b ha dato una buona risposta (+1), che voglio illustrare con un po 'di codice.

Come generare campioni da un -dimensionale distribuzione gaussiana multivariata con una data matrice di covarianza ? Questo è facile da fare generando campioni da un gaussiano standard e moltiplicandoli per una radice quadrata della matrice di covarianza, ad esempio per . Questo è trattato in molti thread sul CV, ad esempio qui: come posso generare dati con una matrice di correlazione prespecificata? Ecco una semplice implementazione di Matlab:d Σ c h o l ( Σ )ndΣchol(Σ)

n = 100;
d = 2;
Sigma = [ 1    0.7  ; ...
          0.7   1   ];
rng(42)
X = randn(n, d) * chol(Sigma);

La matrice di covarianza di esempio dei dati risultanti non sarà ovviamente esattamente ; ad es. nell'esempio sopra riportato ritornaΣcov(X)

1.0690    0.7296
0.7296    1.0720

Come generare dati con una correlazione del campione predefinita o matrice di covarianza?

Come ha scritto @Glen_b, dopo aver generato i dati da uno standard gaussiano, centra, imbianca e standardizza, in modo che abbia una matrice di covarianza di esempio ; solo allora moltiplicalo con .c h o l ( Σ )Ichol(Σ)

Ecco la continuazione del mio esempio di Matlab:

X = randn(n, d);
X = bsxfun(@minus, X, mean(X));
X = X * inv(chol(cov(X)));
X = X * chol(Sigma);

Ora cov(X), come richiesto, ritorna

1.0000    0.7000
0.7000    1.0000

+1. In qualche modo questa domanda è in varie forme in varie posizioni nel CV. C'è un modo di procedere se siamo consapevoli che la distribuzione multivariata è non gaussiana?
RGK

Se conosci la forma della distribuzione multivariata, vuoi che assomigli, forse in alcuni casi.
Glen_b
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.