Gibt es eine allgemeine Methode zur Simulation von Daten aus einer Formel oder Analyse?

15

De-novo-Simulation von Daten aus einem experimentellen Entwurfsdatenrahmen.
Mit einem Fokus auf R (obwohl eine andere Sprachlösung großartig wäre).

Wenn Sie ein Experiment oder eine Umfrage entwerfen, können Sie Daten simulieren und eine Analyse dieser simulierten Daten durchführen, um einen hervorragenden Einblick in die Vor- und Nachteile des Designs zu erhalten.

Ein solcher Ansatz kann auch für das Verständnis und die ordnungsgemäße Verwendung statistischer Tests von entscheidender Bedeutung sein.

Dieser Prozess ist jedoch in der Regel etwas langwierig und viele müssen diesen wichtigen Schritt in einem Experiment oder einer Umfrage überspringen.

Statistische Modelle und Tests enthalten die meisten Informationen, die zur Simulation der Daten erforderlich sind (einschließlich einer Annahme oder einer expliziten Erklärung der Verteilung).

Anhand eines Analysemodells (und der damit verbundenen Annahmen, z. B. Normalität und Gleichgewicht), der Niveaus eines Faktors und eines Maßes für die Signifikanz (z. B. p-Wert) möchte ich simulierte Daten erhalten (im Idealfall mit einer verallgemeinerten Funktion ähnlich wie print (), predict (), simulate ()).

Ist solch ein verallgemeinertes Simulationsframework möglich?

Wenn ja, ist ein solches Framework derzeit verfügbar?

Zum Beispiel möchte ich eine Funktion, wie zum Beispiel:

 sim(aov(response~factor1+factor2*factor3),
          p.values=list(factor1=0.05,
                        factor2=0.05,
                        factor3=0.50,
                        factor2:factor3=0.05),
          levels=list(factor1=1:10,
                      factor2=c("A", "B", "C"),
                      factor3=c("A", "B", "C")))

dh eine verallgemeinerte Version von:

sim.lm<-function(){
library(DoE.base)
design<-fac.design(nlevels=c(10,3,3),
                   factor.names=c("factor1", "factor2", "factor3"),
                   replications=3,
                   randomize=F)

response<-with(design, as.numeric(factor1)+
                      as.numeric(factor2)+
                      as.numeric(factor3)+
                      as.numeric(factor2)*as.numeric(factor3)+
                      rnorm(length(factor1)))

simulation<-data.frame(design, response)}

ODER

sim(glm(response~factor1+factor2*factor3, family=poisson),
         p.values=list(factor1=0.05,
                       factor2=0.05,
                       factor3=0.50,
                       factor2:factor3=0.05),
         levels=list(factor1=1:10,
                     factor2=c("A", "B", "C"),
                     factor3=c("A", "B", "C")))

ODER

  library(lme4)
  sim(lmer(response~factor1+factor2 + (factor2|factor3)),
           F_value=list(factor1=50,
                        factor2=50),
           levels=list(factor1=1:10,
                       factor2=c("A", "B", "C"),
                       factor3=c("A", "B", "C")))

das würde einen vollständigen entsprechenden data.frame erzeugen

mögliche Beispiele für bestimmte Funktionen (bitte nach Belieben bearbeiten)
- arima.sim

Funktion existiert, um ein data.frame der Faktorebenen zu erstellen, ohne die modellierte Antwort:
zB. conf.design
http://cran.r-project.org/web/views/ExperimentalDesign.html

Etienne Low-Décarie
quelle
Beachten Sie, dass Sie eine Fehlerverteilung angeben müssen. Außerdem folge ich Ihren "p.values" - oder "F_value" -Listen nicht vollständig. Ist die Idee, dass sich die Stichprobenverteilungen von F & P auf die aufgelisteten Zahlen konzentrieren?
gung - Wiedereinsetzung von Monica
@gung, die verteilung wird im test angenommen (beide hier nehmen normalität an oder ich hätte sowas wie glm verwenden müssen).
Etienne Low-Décarie
Der Test geht zwar von einer bestimmten Verteilung aus, dies bedeutet jedoch nicht, dass die Daten tatsächlich auf diese Weise generiert wurden. Sie können Daten aus einer beliebigen Anzahl von Verteilungen für verschiedene Zwecke (z. B. Simulationsstudien, Robustheit usw.) generieren.
gung - Wiedereinsetzung von Monica
@gung, ich habe versucht, meine Frage zu bearbeiten, um zu verdeutlichen, dass ich einen Datensatz erstellen möchte, der den Erwartungen des Tests / Modells entspricht. Ich bin nicht auf der Suche nach etwas für eine Simulationsstudie oder eine Robustheitsstudie, sondern um einen Probelauf eines experimentellen Designs bereitzustellen.
Etienne Low-Décarie

Antworten:

10

Es gibt tatsächlich ein S3-Generikum simulate, das sogar den gewünschten Datenrahmen (oder eine andere Liste) zurückgibt. Art

?simulate  

Es gibt bereits Methoden für die Klassen lm (funktioniert auch für glm oder für Ihr Beispiel aov) und glm.nb (in MASS). Sie können jetzt S3- simulateMethoden für andere Klassen von Objekten schreiben , z. B. für Objekte aus lme4. Sie können überprüfen, für welche Klassen es Methoden gibt, indem Sie Folgendes eingeben

getAnywhere("simulate.class"), getAnywhere("simulate")  

oder

getS3method("simulate","class"), methods(simulate) 
Momo
quelle
simulieren wäre großartig, wenn es nicht "ein Objekt erfordern würde, das ein angepasstes Modell darstellt", das selbst bereits Daten oder simulierte Daten benötigt.
Etienne Low-Décarie
>getAnywhere("simulate.class") no object named ‘simulate.class’ was found >getS3method("simulate","class") Error in getS3method("simulate", "class") : S3 method 'simulate.class' not found
Etienne Low-Décarie
2
Man könnte immer ein anfänglich angepasstes Objekt konstruieren, bei dem alle Antwortwerte beispielsweise 0 sind, und die Koeffizienten in der Anpassung durch gewünschte Parameterwerte ersetzen. Dann können simulierte Antworten mit 'simulieren' erhalten werden.
NRH
Das ist wahr. Die Pakete in der Ansicht [Experimentelle Entwurfsaufgabe] ( cran.r-project.org/web/views/ExperimentalDesign.html ) enthalten viele Pakete zum Erstellen des Dummy-Variablen-Setups. Die Simulations- und experimentellen Entwurfsfunktionen zu integrieren, wäre großartig!
Etienne Low-Décarie
Einige Simulationsfunktionen erzeugen die Daten nicht nur passend: stats.stackexchange.com/questions/11233/…
Etienne Low-Décarie
6

Es gibt eine neue Funktion, die simfunim TeachingDemosPaket für R aufgerufen wird (derzeit nur in der Entwicklungsversion von R-Forge , es wird eine Weile dauern, bis CRAN aktiviert ist). Es soll beim Erstellen von Funktionen für Simulationen helfen.

Eine der beabsichtigten Verwendungszwecke ist, dass ein Lehrer die simfunFunktion, um eine Funktion zu erstellen und an die Schüler zu verteilen (möglicherweise haben Sie alternativ irgendwann ein Webinterface). Die Schüler würden dann einen Datenrahmen der Faktoren erstellen, die einen experimentellen Entwurf darstellen, diesen Datenrahmen an die erstellte Funktion übergeben und den Datenrahmen mit einer zusätzlichen Spalte der Antwort zurückgeben, die gemäß den vom Lehrer festgelegten Parametern und der Fehlerverteilung simuliert wurde Anschließend kann der Schüler die Daten analysieren. Auf diese Weise kann der Lehrer eine "wahre" Beziehung aufbauen, aber die Schüler können viele verschiedene experimentelle Entwürfe ausprobieren, um Wege zu finden, wie sie in viel kürzerer Zeit als bei einem tatsächlichen Experiment zur "Wahrheit" gelangen können und weniger Arbeit für den Lehrer als nötig Erstellen oder finden Sie eine Reihe verschiedener Beispieldatensätze, die die verschiedenen möglichen Designs darstellen.

Die simfunFunktion ist flexibel ausgelegt, sodass der Lehrer / Ersteller die Simulationen auf der Grundlage eines angepassten Regressionsmodells, der vom Lehrer / Ersteller bereitgestellten Parameter oder der vom Schüler / Benutzer eingegebenen Parameter erstellen kann.

Die erstellte Funktion kann auch problemlos in Simulationen (mit dem replicateBefehl) verwendet werden, um Leistung, Stichprobengröße, Effektgröße usw. zu ermitteln. Die resultierende Simulation ist jedoch möglicherweise langsamer als die manuelle Erstellung des Simulationsprozesses.

Dies sieht so aus, wie Sie es beschreiben, mit der Ausnahme, dass zum Erstellen der Daten keine p-Werte erforderlich sind, sondern dass mithilfe von power.Funktionen oder pwr.aus dem pwrPaket Simulationen erstellt werden können, die auf der Angabe von Potenz und Alpha anstelle von Mitteln und Unterschieden basieren.

Hier ist ein Beispiel von der Hilfeseite (es gibt mehrere weitere Beispiele), das davon ausgeht, dass Sie die Höhe von Personen (männlich und weiblich) messen, die in Städten verschachtelt sind, die in Bundesstaaten verschachtelt sind. Für Bundesstaaten mit SD gibt es einen zufälligen Effekt von 1 und einen zufälligen Effekt für Stadt (innerhalb des Staates) mit einer SD von 0,5, dann ist die "Fehler" SD 3, Frauen haben einen Simulationsmittelwert von 64 Zoll und Männer haben einen Mittelwert von 69 Zoll (der Fehler SD und die Mittelwerte sind realistisch) sind die zufälligen Effekte ein bisschen erfunden). Die simfunFunktion wird verwendet, um eine neue Funktion zu erstellen, die aufgerufen wird simheight, und dann wird ein Datenrahmen mit Status-IDs, Stadt-IDs und einer Spalte für das Geschlecht des Probanden (das experimentelle Design oder das Stichproben-Design) erstellt, an das dies übergeben wirdsimheight und das Ergebnis in einem neuen Datenrahmen mit den simulierten Höhen (zusätzlich zu den anderen Variablen), die dann mit geeigneten Werkzeugen analysiert werden könnten.

# simulate a nested mixed effects model
simheight <- simfun({
  n.city <- length(unique(city))
  n.state <- length(unique(state))
  n <- length(city)
  height <- h[sex] + rnorm(n.state,0,sig.state)[state] + 
    rnorm(n.city,0,sig.city)[city] + rnorm(n,0,sig.e)
}, sig.state=1, sig.city=0.5, sig.e=3, h=c(64,69),
  drop=c('sig.state','sig.city','sig.e','h','n.city','n.state','n'))

tmpdat <- data.frame(state=gl(5,20), city=gl(10,10), 
  sex=gl(2,5,length=100, labels=c('F','M')))
heightdat <- simheight(tmpdat)
Greg Snow
quelle
Ich kann die neuen TeachingDemos auf R-Forge nicht finden.
Etienne Low-Décarie
1
install.packages ("TeachingDemos", repos = " R-Forge.R-project.org" )
Etienne Low-Décarie
Versuchen Sie es install.packages("TeachingDemos", repos="http://R-Forge.R-project.org"). Sie benötigen am Anfang "http: //" und kein ";".
Greg Snow
3

Tippen methods(simulate) oder getAnywhere("simulate")sollte funktionieren. Ersteres bietet Ihnen einige Methoden, wenn das Paket lme4 geladen ist:

[1] simulate.lm * simulate.merMod * simulate.negbin * simulate.polr *

Lm-Objekte werden sowohl für lm- als auch für glm-Modelle verwendet.

JTT
quelle
2
Danke, aber das scheint @ Momos Antwort zu sein.
Etienne Low-Décarie