Generieren von Daten mit einer bestimmten Stichproben-Kovarianzmatrix

22

Wie kann man bei gegebener Kovarianzmatrix Daten so generieren, dass sie die Beispiel-Kovarianzmatrix ?ΣsΣ^=Σs


Allgemeiner: Wir sind oft daran interessiert, Daten aus einer Dichte generieren , wobei Daten x einen Parametervektor \ boldsymbol \ theta haben . Dies ergibt eine Stichprobe, aus der wir dann wieder einen Wert \ boldsymbol {\ hat \ theta} abschätzen können . Was mich interessiert, ist das umgekehrte Problem: Was ist, wenn wir eine Reihe von Parametern \ boldsymbol \ theta_ {s} erhalten und wir möchten ein Beispiel x erzeugen , das \ boldsymbol {\ hat \ theta} = \ boldsymbol \ theta_ {s} .f(x|θ)xθθ^θsxθ^=θs

Ist das ein bekanntes Problem? Ist eine solche Methode sinnvoll? Sind Algorithmen verfügbar?

Kees Mulder
quelle
Eine skalierbare Lösung bietet Attilio Meucci. Siehe diesen Risiko-Artikel und Matlab-Code
Peter Cotton

Antworten:

16

Es gibt zwei typische Situationen für diese Art von Problemen:

i) Sie möchten eine Stichprobe aus einer bestimmten Verteilung erstellen, deren Populationsmerkmale mit den angegebenen übereinstimmen (aufgrund von Stichprobenvariationen stimmen die Stichprobenmerkmale jedoch nicht genau überein).

ii) Sie möchten eine Stichprobe generieren, deren Stichprobenmerkmale mit den angegebenen übereinstimmen (aufgrund der Einschränkungen, dass die Stichprobenmengen genau auf einen vorgegebenen Satz von Werten abgestimmt sind, stammen Sie jedoch nicht wirklich aus der gewünschten Verteilung).

Sie möchten den zweiten Fall - aber Sie erhalten ihn, indem Sie denselben Ansatz wie im ersten Fall mit einem zusätzlichen Standardisierungsschritt verfolgen.

Für multivariate Normalen kann beides relativ einfach erfolgen:

Im ersten Fall könnten Sie zufällige Normalen ohne die Populationsstruktur verwenden (z. B. iid-Standardnormal mit der Erwartung 0 und der Identitätskovarianzmatrix) und diese dann auferlegen - transformieren, um die gewünschte Kovarianzmatrix und den gewünschten Mittelwert zu erhalten. Wenn und das Populationsmittel und die Kovarianz sind, die Sie benötigen, und normal ist, berechnen Sie für einige mit (z. B. könnte ein geeignetes durch Cholesky-Zerlegung erhalten werden). . Dann hat die gewünschten Populationsmerkmale.μΣzy=Lz+μLLL=ΣLy

Bei der zweiten müssen Sie zuerst Ihre Zufallsnormalen transformieren, um auch die zufällige Abweichung vom Nullmittelwert und der Identitätskovarianz zu entfernen (wobei Stichprobenmittelwert und Stichprobenkovarianz ), und dann wie zuvor fortfahren. Dieser erste Schritt des Entfernens der Stichprobenabweichung vom exakten Mittelwert , Varianz stört jedoch die Verteilung. (In kleinen Proben kann es ziemlich schwerwiegend sein.)In0I

Dies kann durch Subtrahieren des Abtastmittelwerts von ( ) und Berechnen der Cholesky-Zerlegung von . Wenn der linke Cholesky-Faktor ist, sollte Stichprobenmittelwert 0 und die Kovarianz der Identitätsstichprobe haben. Sie können dann berechnen und eine Stichprobe mit den gewünschten Stichprobenmomenten erstellen. (Je nachdem, wie Ihre Stichprobenmengen definiert sind, kann es sein, dass es sich bei der Multiplikation / Division durch Faktoren wie um eine besonders kleine Fiedel handelt , aber es ist einfach genug, diesen Bedarf zu identifizieren.)zz=zz¯zLz(0)=(L)1zy=Lz(0)+μn1n

Glen_b - Setzen Sie Monica wieder ein
quelle
1
+1. Neulich musste ich einige Daten mit einer bestimmten Beispiel-Kovarianzmatrix generieren, wusste nicht, wie es geht, und aus irgendeinem Grund brauchte ich viel Zeit, um Ihre Antwort zu finden. Um die Sichtbarkeit dieses Threads zu erhöhen und Ihre Vorschläge zu veranschaulichen, habe ich hier eine andere Antwort mit Matlab-Code gepostet.
Amöbe sagt Reinstate Monica
@amoeba Ich frage mich, ob es eine Möglichkeit gibt, einen der von Ihnen verwendeten Suchbegriffe, die hier noch nicht vorhanden sind, in die Frage-Tags einzufügen (oder möglicherweise mehrere in einer kleinen Bearbeitung in den Text der Frage einzufügen, was dennoch helfen sollte, ihn zu finden ). Ich frage mich jetzt, ob ich dasselbe in R tun soll ... aber geht es dann besser in meiner Antwort oder als Ergänzung zu deiner?
Glen_b -Reinstate Monica
1
Ich habe mir bereits die Freiheit genommen, die Frage zu bearbeiten, und habe auch versucht, meine Antwort so zu formulieren, dass sie so viele Schlüsselwörter wie möglich enthält. Hoffe das wird helfen. Ich war übrigens überrascht, dass dieser einfache Tipp (die generierten Daten aufzuhellen, bevor sie in die erforderliche Kovarianz umgewandelt werden) so schwer zu googeln war. konnte nichts finden (im Lebenslauf oder anderswo), bis ich endlich deine Antwort gefunden habe.
Amöbe sagt Reinstate Monica
1
@amoeba Oh, okay, danke. Ja, eigentlich kann ich nicht sagen, dass ich mich erinnern konnte, jemals irgendwo für den multivariaten Fall erwähnt worden zu sein (zweifellos, da es eine ziemlich offensichtliche Idee war, besonders wenn Sie bereits für den univariaten Fall darüber nachgedacht haben oder dies getan haben) bereits im univariaten Fall gesehen).
Glen_b -Reinstate Monica
@ Glen_b Wie Sie sagen, kann die resultierende Verteilung dieser "gereinigten" Proben nicht normal sein. Haben Sie eine Idee, wie die resultierende Verteilung aussehen könnte? Oder vielleicht ist es gleich der bedingten VerteilungZz¯=μ,Cov(z)=Σ
gg
17

@ Glen_b gab eine gute Antwort (+1), die ich mit etwas Code veranschaulichen möchte.

Wie kann man Samples aus einer dimensionalen multivariaten Gaußverteilung mit einer gegebenen Kovarianzmatrix erzeugen ? Dies ist einfach zu bewerkstelligen, indem Samples aus einem Standard-Gauß-Wert erzeugt und mit einer Quadratwurzel der Kovarianzmatrix multipliziert werden, z. B. mit . Dies wird in vielen Themen zum Lebenslauf behandelt, z. B .: Wie kann ich Daten mit einer vorgegebenen Korrelationsmatrix generieren? Hier ist eine einfache Matlab-Implementierung:ndΣchol(Σ)

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

Die Beispiel-Kovarianzmatrix der resultierenden Daten ist natürlich nicht genau ; zB im obigen Beispiel wird zurückgegebenΣcov(X)

1.0690    0.7296
0.7296    1.0720

Wie generiere ich Daten mit einer vorgegebenen Stichprobenkorrelation oder Kovarianzmatrix?

Wie @Glen_b schrieb, zentrieren, bleichen und standardisieren Sie die Daten nach dem Generieren aus einem Standard-Gaußschen, sodass sie die Beispiel-Kovarianzmatrix . erst dann multipliziere es mit .Ichol(Σ)

Hier ist die Fortsetzung meines Matlab-Beispiels:

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

Nun cov(X)kehrt er nach Bedarf zurück

1.0000    0.7000
0.7000    1.0000
Amöbe sagt Reinstate Monica
quelle
+1. Irgendwie ist diese Frage in verschiedenen Formen an verschiedenen Stellen im Lebenslauf. Gibt es eine Möglichkeit, fortzufahren, wenn wir uns bewusst sind, dass die multivariate Verteilung nicht gaußsch ist?
rgk
Wenn Sie die Form der multivariaten Verteilung kennen, möchten Sie, dass sie in einigen Fällen so aussieht.
Glen_b