È disponibile un metodo generale per simulare i dati da una formula o un'analisi?


16

Simulazione de novo di dati da un frame di dati di progettazione sperimentale.
Con un focus su R (anche se la soluzione di un'altra lingua sarebbe ottima).

Nel progettare un esperimento o un sondaggio, simulare i dati e condurre un'analisi su questi dati simulati può fornire una visione eccezionale dei vantaggi e dei punti deboli del progetto.

Tale approccio può anche essere essenziale per la comprensione e l'uso corretto dei test statistici.

Tuttavia, questo processo tende ad essere un po 'noioso e molti sono portati a saltare questo importante passaggio in un esperimento o in un sondaggio.

I modelli statistici e i test contengono la maggior parte delle informazioni richieste per simulare i dati (incluso un presupposto o una dichiarazione esplicita della distribuzione).

Dato un modello di analisi (e le ipotesi associate, ad es. Normalità ed equilibrio), i livelli di un fattore e una misura di significatività (come il valore p), vorrei ottenere dati simulati (idealmente con una funzione generalizzata simile a print (), predict (), simulate ()).

È possibile un tale quadro di simulazione generalizzato?

In tal caso, tale quadro è attualmente disponibile?

Esempio, vorrei una funzione, come ad esempio:

 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")))

cioè una versione generalizzata di:

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)}

O

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")))

O

  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")))

che creerebbe un data.frame corrispondente completo

potenziali esempi di funzioni specifiche (modificare a piacere)
- arima.sim

esiste una funzione per creare un data.frame dei livelli di fattore, senza la risposta modellata:
ad es. conf.design
http://cran.r-project.org/web/views/ExperimentalDesign.html


Una cosa da tenere a mente è che è necessario specificare una distribuzione degli errori. Inoltre, non seguo completamente le tue liste "p.values" o "F_value"; l'idea è che le distribuzioni campionarie di F & p siano centrate sui numeri elencati?
gung - Ripristina Monica

@gung, la distribuzione è assunta nel test (entrambi qui assumono la normalità o avrei dovuto usare qualcosa come glm).
Etienne Low-Décarie,

Il test presuppone certamente una distribuzione specifica, ma ciò non significa che i dati siano stati effettivamente generati in quel modo. È possibile generare dati da qualsiasi numero di distribuzioni per vari scopi (ad es. Studi di simulazione, affidabilità, ecc.).
gung - Ripristina Monica

@gung, ho provato a modificare la mia domanda per chiarire che voglio creare un set di dati che corrisponda alle aspettative del test / modello. Non sto cercando qualcosa per uno studio di simulazione o per uno studio sulla robustezza, ma per fornire una serie di progetti sperimentali.
Etienne Low-Décarie,

Risposte:


10

In realtà esiste un generico S3 simulateche restituisce anche il frame di dati (o altro elenco) desiderato. genere

?simulate  

Ha metodi per le classi lm (funziona anche per glm o per il tuo esempio aov) e glm.nb (in MASS) già. Ora puoi scrivere simulatemetodi S3 per altre classi di oggetti, ad es. Per oggetti da lme4. È possibile verificare per quali classi esistono metodi digitando

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

o

getS3method("simulate","class"), methods(simulate) 

simulare sarebbe ottimo se non richiedesse "un oggetto che rappresenta un modello adattato" che a sua volta richiede già dati o dati simulati.
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
Si potrebbe sempre costruire un oggetto adattato iniziale con tutti i valori di risposta pari a 0, diciamo, e sostituire i coefficienti nell'adattamento con i valori dei parametri desiderati. Quindi è possibile ottenere risposte simulate usando 'simula'.
NRH,

Questo è vero. I pacchetti nella vista [task di progettazione sperimentale] ( cran.r-project.org/web/views/ExperimentalDesign.html ) hanno molti pacchetti per creare la configurazione della variabile fittizia. Integrare le funzioni di progettazione simulata e sperimentale sarebbe fantastico!
Etienne Low-Décarie,

Alcune funzioni di simulazione non creano solo i dati adatti: stats.stackexchange.com/questions/11233/…
Etienne Low-Décarie,

6

C'è una nuova funzione chiamata simfunnel TeachingDemospacchetto per R (attualmente è solo nella versione di sviluppo su R-forge , ci vorrà un po 'prima che sia su CRAN). Ha lo scopo di aiutare con la creazione di funzioni per fare simulazioni.

Uno degli usi previsti è che un insegnante userebbe il simfunfunzione per creare una funzione e distribuirla agli studenti (possibilmente avere un'interfaccia web ad un certo punto in alternativa). Gli studenti dovrebbero quindi creare un frame di dati dei fattori che rappresentano un progetto sperimentale, passare questo frame di dati alla funzione creata e ottenere il frame di dati con una colonna aggiuntiva della risposta simulata in base ai parametri e alla distribuzione degli errori impostati dall'insegnante , lo studente può quindi analizzare i dati. Ciò consente all'insegnante di stabilire una relazione "Vero", ma consente agli studenti di provare molti diversi progetti sperimentali per esplorare i modi per ottenere la "Verità" in molto meno tempo rispetto a un esperimento reale e che richiede meno lavoro per l'insegnante che per creare o trovare un insieme di set di dati di esempio diversi che rappresentano i diversi progetti possibili.

La simfunfunzione è progettata per essere flessibile in modo che l'insegnante / creatore possa basare le simulazioni su un modello di regressione adattato, sui parametri forniti dall'insegnante / creatore o sui parametri forniti dallo studente / utente.

La funzione creata può anche essere facilmente utilizzata nelle simulazioni (con il replicatecomando) per esplorare la potenza, la dimensione del campione, la dimensione dell'effetto, ecc. Sebbene la simulazione risultante possa essere più lenta della creazione manuale del processo di simulazione.

Questo sembra quello che descrivi con l'eccezione che non ci vogliono valori p per creare i dati, ma l'uso di power.funzioni o pwr.dal pwrpacchetto potrebbe essere incorporato per creare simulazioni basate sulla specifica di potenza e alfa piuttosto che su mezzi e differenze.

Ecco un esempio dalla pagina di aiuto (ci sono molti altri esempi) che presume che tu stia misurando le altezze di soggetti (maschi e femmine) che sono nidificati in città che sono nidificate negli stati, c'è un effetto casuale per lo stato con una SD di 1 e un effetto casuale per città (all'interno dello stato) con una SD di 0,5, quindi la SD "error" è 3, le femmine hanno una media di simulazione di 64 pollici e i maschi hanno una media di 69 pollici (l'errore SD e i mezzi sono realistici , gli effetti casuali sono un po 'forzati). La simfunfunzione viene utilizzata per creare una nuova funzione chiamata simheight, quindi viene creato un frame di dati con ID stato, ID città e una colonna per il sesso del soggetto (il disegno sperimentale o il disegno di campionamento), questo viene passato asimheight e il risultato in un nuovo frame di dati con le altezze simulate (oltre alle altre variabili) che potrebbero quindi essere analizzate utilizzando strumenti appropriati.

# 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)

Non riesco a trovare il nuovo TeachingDemos su R-Forge?
Etienne Low-Décarie,

1
install.packages ("TeachingDemos", repos = " R-Forge.R-project.org" )
Etienne Low-Décarie,

Prova install.packages("TeachingDemos", repos="http://R-Forge.R-project.org"). È necessario "http: //" all'inizio e no ";".
Greg Snow,

3

Digitando methods(simulate)o getAnywhere("simulate")dovrebbe funzionare. Il primo offre alcuni metodi, se il pacchetto lme4 è caricato:

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

Gli oggetti Lm sono usati sia per i modelli lm che glm.


2
Grazie, ma questa sembra la risposta di @ Momo.
Etienne Low-Décarie,
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.