Diese Frage ist durch meine Frage zur Metaanalyse motiviert . Ich stelle mir jedoch vor, dass dies auch in Lehrkontexten nützlich ist, in denen Sie ein Dataset erstellen möchten, das genau einem vorhandenen veröffentlichten Dataset entspricht.
Ich weiß, wie man zufällige Daten aus einer bestimmten Distribution generiert. Wenn ich also zum Beispiel über die Ergebnisse einer Studie lese, die Folgendes hatte:
- ein Mittelwert von 102,
- eine Standardabweichung von 5,2 und
- eine Stichprobengröße von 72.
Ich könnte ähnliche Daten mit rnorm
in R erzeugen . Zum Beispiel
set.seed(1234)
x <- rnorm(n=72, mean=102, sd=5.2)
Natürlich wären der Mittelwert und die SD nicht exakt gleich 102 bzw. 5,2:
round(c(n=length(x), mean=mean(x), sd=sd(x)), 2)
## n mean sd
## 72.00 100.58 5.25
Im Allgemeinen interessiert mich, wie man Daten simuliert, die eine Reihe von Einschränkungen erfüllen. Im obigen Fall sind die Konstanten Stichprobengröße, Mittelwert und Standardabweichung. In anderen Fällen kann es zu zusätzlichen Einschränkungen kommen. Zum Beispiel,
- Möglicherweise sind ein Minimum und ein Maximum in den Daten oder der zugrunde liegenden Variablen bekannt.
- Es ist möglicherweise bekannt, dass die Variable nur ganzzahlige oder nur nicht negative Werte annimmt.
- Die Daten können mehrere Variablen mit bekannten Wechselbeziehungen enthalten.
Fragen
- Wie kann ich im Allgemeinen Daten simulieren, die genau einer Reihe von Einschränkungen entsprechen?
- Gibt es Artikel darüber? Gibt es Programme in R, die dies tun?
- Wie könnte und sollte ich beispielsweise eine Variable so simulieren, dass sie einen bestimmten Mittelwert und eine bestimmte SD hat?
quelle
x<-rnorm(72);x<-5.2*(x-mean(x))/sd(x)+102
macht den Trick.Antworten:
Im Allgemeinen können Sie die Variable entsprechend verschieben und skalieren, damit der Mittelwert und die Varianz Ihrer Stichprobe genau einem vorgegebenen Wert entsprechen. Insbesondere dann , wenn ist eine Stichprobe, dann die neuen VariablenX1,X2,...,Xn
wobeiX¯¯¯¯=1n∑ni=1Xi s2X=1n−1∑ni=1(Xi−X¯¯¯¯)2 Zi c2 c1
erzeugt einen Datensatz , der auf das Intervall .B1,...,Bn (a,b)
Hinweis: Diese Arten der Verschiebung / Skalierung ändern im Allgemeinen die Verteilungsfamilie der Daten, auch wenn die Originaldaten aus einer Familie mit Ortsskalen stammen.
Im Rahmen der Normalverteilung können Sie mit der
mvrnorm
Funktion inR
normale (oder multivariate) Daten mit einem vorgegebenen Stichprobenmittelwert / einer vorgegebenen Kovarianz simulierenempirical=TRUE
. Insbesondere simuliert diese Funktion Daten aus der bedingten Verteilung einer normalverteilten Variablen, vorausgesetzt, der Stichprobenmittelwert und die (Co) Varianz entsprechen einem vorgegebenen Wert . Beachten Sie, dass die resultierenden Randverteilungen nicht normal sind, wie @whuber in einem Kommentar zur Hauptfrage anmerkt.Hier ist ein einfaches univariates Beispiel, bei dem der Stichprobenmittelwert (aus einer Stichprobe von ) auf 0 und die Stichprobenstandardabweichung auf 1 beschränkt ist. Wir können sehen, dass das erste Element einer gleichmäßigen Verteilung weitaus ähnlicher ist als einer Normalverteilung Verteilung:n=4
quelle
In Bezug auf Ihre Anfrage für Papiere gibt es:
Dies ist nicht ganz das, wonach Sie suchen, könnte aber als Mahlgut für die Mühle dienen.
Es gibt eine andere Strategie, die anscheinend niemand erwähnt hat. Es ist möglich, (Pseudo) Zufallsdaten aus einer Menge der Größe zu erzeugen, so dass die gesamte Menge Bedingungen erfüllt , solange die verbleibenden Daten auf geeignete Werte festgelegt sind. Die erforderlichen Werte sollten mit einem System aus Gleichungen, Algebra und etwas Ellbogenfett lösbar sein .N−k N k k k
Um beispielsweise einen Satz von Daten aus einer Normalverteilung mit einem bestimmten Stichprobenmittelwert ( ) und einer Varianz ( zu generieren , müssen Sie die Werte von zwei Punkten festlegen: und . Da der Stichprobenmittelwert ist: muss sein: Die Stichprobenvarianz ist: also (nach Ersetzen von das Obige , Folieren / Verteilen & Umordnen ... ) wir bekommen:N x¯ s2 y z
R
Es gibt einige Dinge zu verstehen, über diesen Ansatz. Erstens ist es nicht garantiert zu arbeiten. Zum Beispiel ist es möglich, dass Ihre anfänglichen Daten so sind, dass keine Werte und existieren, die die Varianz der resultierenden Menge gleich . Erwägen:N−2 y z s2
Zweitens: Während durch die Standardisierung die Randverteilungen aller Ihrer Variablen einheitlicher werden, wirkt sich dieser Ansatz nur auf die letzten beiden Werte aus, führt jedoch zu einer Verschiebung der Randverteilungen:
Drittens sieht die resultierende Stichprobe möglicherweise nicht ganz normal aus. Es könnte so aussehen, als hätte es Ausreißer (dh Punkte, die aus einem anderen Datenerzeugungsprozess stammen als der Rest), da dies im Wesentlichen der Fall ist. Dies ist bei größeren Stichproben weniger wahrscheinlich, da die Stichprobenstatistik aus den generierten Daten auf die erforderlichen Werte konvergieren sollte und daher weniger Anpassungen erforderlich sind. Bei kleineren Stichproben können Sie diesen Ansatz immer mit einem Annahme- / Ablehnungsalgorithmus kombinieren, der es erneut versucht, wenn die generierte Stichprobe Formstatistiken (z. B. Schiefe und Kurtosis) aufweist, die außerhalb akzeptabler Grenzen liegen (vgl. @ Kardinals Kommentar ) oder erweitert werden dieser Ansatz zur Erzeugung einer Stichprobe mit einem festen Mittelwert, einer festen Varianz, einer festen Schiefe undKurtosis (die Algebra überlasse ich Ihnen). Alternativ können Sie eine kleine Anzahl von Stichproben generieren und die mit der kleinsten Kolmogorov-Smirnov-Statistik verwenden.
quelle
Die allgemeine Technik ist die "Ablehnungsmethode", bei der Sie nur Ergebnisse ablehnen, die nicht Ihren Vorgaben entsprechen. Wenn Sie keine Anleitung (wie MCMC) haben, können Sie (abhängig von Ihrem Szenario) viele Fälle generieren, die abgelehnt werden!
Wenn Sie nach einem Mittelwert und einer Standardabweichung suchen und eine Entfernungsmetrik erstellen können, die angibt, wie weit Sie von Ihrem Ziel entfernt sind, können Sie mithilfe der Optimierung nach den Eingabevariablen suchen, die Ihnen die gewünschte Ausgabe liefern Werte.
Als ein hässliches Beispiel, in dem wir nach einem zufälligen gleichförmigen Vektor mit einer Länge von 100 suchen, der einen Mittelwert von 0 und eine Standardabweichung von 1 hat.
quelle
Das Runuran R-Paket enthält viele Methoden zum Generieren von Zufallsvariablen. Es verwendet C-Bibliotheken aus dem UNU.RAN-Projekt (Universal Non-Uniform RAndom Number Generator). Mein eigenes Wissen über das Gebiet der Zufallsgenerierung ist begrenzt, aber die Runuran- Vignette bietet einen guten Überblick. Im Folgenden sind die verfügbaren Methoden des Runuran-Pakets aufgeführt, die der Vignette entnommen wurden:
Kontinuierliche Verteilungen:
Diskrete Verteilungen:
Multivariate Verteilungen:
Beispiel:
Angenommen, Sie möchten eine Normalverteilung zwischen 0 und 100 generieren:
Die
urnorm()
Funktion ist eine praktische Wrapper-Funktion. Ich glaube, dass es hinter den Kulissen die Polynomial Interpolation of Inverse CDF-Methode verwendet, bin mir aber nicht sicher. Für etwas komplexeres, sagen wir eine diskrete Normalverteilung, die zwischen 0 und 100 liegt:quelle
Es scheint, dass es ein R-Paket gibt, das Ihren Anforderungen entspricht, das erst gestern veröffentlicht wurde! simstudy Von Keith Goldfeld
quelle
Dies ist eine Antwort, die so spät kommt, dass sie vermutlich bedeutungslos ist, aber es gibt immer eine MCMC-Lösung für die Frage. Nämlich, um die Verbindungsdichte der Probe auf den durch die Bedingungen definierten Verteiler zu projizieren , zum Beispiel Das einzige Problem ist dann, Werte über diesen Verteiler zu simulieren, dh eine Parametrisierung der richtigen Dimension zu finden. Eine Veröffentlichung von Bornn, Shephard und Solgi aus dem Jahr 2015 untersucht genau dieses Problem (mit einer interessanten, wenn nicht endgültigen Antwort ).
quelle
Diese Antwort berücksichtigt einen anderen Ansatz für den Fall, dass Sie die Variationen zwingen möchten, in einem bestimmten Bereich zu liegen, und zusätzlich den Mittelwert und / oder die Varianz vorgeben möchten .
Beschränken Sie unsere Aufmerksamkeit auf das Einheitsintervall . Lassen Sie uns einen gewichteten Mittelwert für die Allgemeinheit verwenden, also setzen Sie einige Gewichte mit , oder setzen Sie wenn Sie eine Standardgewichtung wünschen. Angenommen, die Größen und repräsentieren den gewünschten (gewichteten) Mittelwert bzw. die gewünschte (gewichtete) Varianz. Die Obergrenze für ist erforderlich, da dies die maximal mögliche Varianz für ein Einheitsintervall ist. Wir sind daran interessiert, einige Variablen aus mit diesen Momenteinschränkungen zu zeichnen .[0,1] wk∈[0,1] ∑Nk=1wk=1 wk=1/N μ∈(0,1) 0<σ2<μ(1−μ) σ2 x1,...,xN [0,1]
Zuerst zeichnen wir einige Variablen aus einer beliebigen Verteilung wie . Diese Verteilung beeinflusst die Form der endgültigen Verteilung. Dann beschränken wir sie mit einer logistischen Funktion auf das Einheitsintervall :y1,...,yN N(0,1) [0,1]
Bevor wir dies tun, transformieren wir jedoch, wie in der obigen Gleichung gezeigt, die mit der Translation und der Skala . Dies ist analog zu der ersten Gleichung in der Antwort von @ Macro. Der Trick besteht nun darin, und so zu wählen , dass die transformierten Variablen die gewünschten Momente haben. Das heißt, wir benötigen eine oder beide der folgenden :yk h v h v x1,...,xN
Das analytische Invertieren dieser Gleichungen für und ist nicht möglich, aber numerisch ist unkompliziert, zumal Ableitungen in Bezug auf und leicht zu berechnen sind. es dauert nur ein paar Iterationen von Newtons Methode.v h v h
Als erstes Beispiel wollen wir nur den gewichteten Mittelwert und nicht die Varianz einschränken. Fix , , , . Dann erhalten wir für die zugrunde liegenden Verteilungen , und die folgenden Histogramme, und zwar so, dass der Mittelwert der Variablen genau beträgt (auch für kleine ):v = 1 w k = 1 / N N = 200000 N ( 0 , 1 ) , N ( 0 , 0,1 ) Unif ( 0 , 1 ) , 0,8 Nμ=0.8 v=1 wk=1/N N=200000 N(0,1) N(0,0.1) Unif(0,1) 0.8 N
Als nächstes beschränken wir sowohl den Mittelwert als auch die Varianz. Nehmen Sie , , und betrachten Sie die drei gewünschten Standardabweichungen . Unter Verwendung der gleichen zugrunde liegenden Verteilung sind hier die Histogramme für jedes:w k = 1 / N N = 2000 σ = 0,1 , 0,05 , 0,01 N ( 0 , 1 )μ=0.2 wk=1/N N=2000 σ=0.1,0.05,0.01 N(0,1)
Beachten Sie, dass diese möglicherweise ein bisschen Beta-verteilt aussehen, aber nicht.
quelle
In meiner Antwort hier habe ich drei R-Pakete dafür aufgelistet:
quelle