Existe-t-il une méthode générale de simulation des données à partir d'une formule ou d'une analyse?

16

Simulation de novo des données d'un bloc de données de conception expérimentale.
En mettant l'accent sur R (même si une autre solution linguistique serait formidable).

Lors de la conception d'une expérience ou d'une enquête, la simulation de données et la réalisation d'une analyse sur ces données simulées peuvent fournir un aperçu formidable des avantages et des faiblesses de la conception.

Une telle approche peut également être essentielle à la compréhension et à la bonne utilisation des tests statistiques.

Cependant, ce processus a tendance à être quelque peu fastidieux et beaucoup sont amenés à sauter cette étape importante dans une expérience ou une enquête.

Les modèles statistiques et les tests contiennent la plupart des informations nécessaires pour simuler les données (y compris une hypothèse ou un énoncé explicite de la distribution).

Étant donné un modèle d'analyse (et ses hypothèses associées, par exemple la normalité et l'équilibre), les niveaux d'un facteur et une mesure de signification (comme la valeur p), je voudrais obtenir des données simulées (idéalement avec une fonction généralisée semblable à imprimer (), prédire (), simuler ()).

Un tel cadre de simulation généralisé est-il possible?

Si oui, un tel cadre est-il actuellement disponible?

Exemple, je voudrais une fonction, telle que:

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

c'est-à-dire une version généralisée de:

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

OU

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

OU

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

qui créerait un data.frame correspondant complet

exemples potentiels de fonctions spécifiques (veuillez modifier à volonté)
- arima.sim

existe pour créer un data.frame des niveaux de facteur, sans la réponse modélisée:
par ex. conf.design
http://cran.r-project.org/web/views/ExperimentalDesign.html

Etienne Low-Décarie
la source
Une chose à garder à l'esprit est que vous devez spécifier une distribution d'erreur. De plus, je ne respecte pas complètement vos listes "p.values" ou "F_value"; est l'idée que les distributions d'échantillonnage de F & p soient centrées sur les nombres énumérés?
gung - Rétablir Monica
@gung, la distribution est supposée dans le test (les deux ici supposent la normalité ou j'aurais dû utiliser quelque chose comme glm).
Etienne Low-Décarie
Le test suppose certainement une distribution spécifique, mais cela ne signifie pas que les données ont effectivement été générées de cette manière. Vous pouvez générer des données à partir de n'importe quel nombre de distributions à diverses fins (par exemple, études de simulation, robustesse, etc.).
gung - Rétablir Monica
@gung, j'ai essayé de modifier ma question pour préciser que je veux créer un ensemble de données qui correspond aux attentes du test / modèle. Je ne cherche pas quelque chose pour une étude de simulation ou une étude de robustesse, mais pour fournir un essai à sec d'une conception expérimentale.
Etienne Low-Décarie

Réponses:

10

Il existe en fait un générique S3 simulatequi renvoie même la trame de données (ou une autre liste) que vous souhaitez. Type

?simulate  

Il a déjà des méthodes pour les classes lm (fonctionne aussi pour glm ou pour votre exemple aov) et glm.nb (dans MASS). Vous pouvez maintenant écrire des simulateméthodes S3 pour d'autres classes d'objets, par exemple pour des objets de lme4. Vous pouvez vérifier pour quelles classes il existe des méthodes en tapant

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

ou

getS3method("simulate","class"), methods(simulate) 
Momo
la source
simuler serait formidable s'il ne nécessitait pas "un objet représentant un modèle ajusté" qui lui-même nécessite déjà des données ou des données simulées.
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
On pourrait toujours construire un objet ajusté initial avec toutes les valeurs de réponse égales à 0, par exemple, et remplacer les coefficients de l'ajustement par les valeurs de paramètre souhaitées. Ensuite, les réponses simulées peuvent être obtenues en utilisant «simuler».
NRH
C'est vrai. Les packages de la [tâche de conception expérimentale] ( cran.r-project.org/web/views/ExperimentalDesign.html ) nombreux packages pour créer la configuration de la variable factice. L'intégration des fonctions de simulation et de conception expérimentale serait formidable!
Etienne Low-Décarie
Certaines fonctions de simulation ne créent pas uniquement les données: fit.stackexchange.com/questions/11233/…
Etienne Low-Décarie
6

Il y a une nouvelle fonction appelée simfundans le TeachingDemospackage pour R (elle n'est actuellement que dans la version de développement sur R-forge , il faudra un certain temps avant qu'elle ne soit sur CRAN). Il est destiné à aider à créer des fonctions pour effectuer des simulations.

L’une des utilisations prévues est qu’un enseignant utilise le simfunpour créer une fonction et la distribuer aux étudiants (éventuellement avoir une interface Web à un moment donné comme alternative). Les élèves créeraient ensuite un bloc de données des facteurs représentant un plan expérimental, passeraient ce bloc de données à la fonction créée et recevraient le bloc de données avec une colonne supplémentaire de la réponse simulée en fonction des paramètres et de la distribution des erreurs définis par l'enseignant , l'étudiant peut ensuite analyser les données. Cela permet à l'enseignant de mettre en place une "vraie" relation, mais permet aux élèves d'essayer de nombreux modèles expérimentaux différents pour explorer des moyens d'obtenir la "vérité" en beaucoup moins de temps que de faire une expérience réelle et nécessitant moins de travail pour l'enseignant que pour créer ou trouver un ensemble de différents jeux de données échantillons représentant les différents modèles possibles.

La simfunfonction est conçue pour être flexible afin que l'enseignant / créateur puisse baser les simulations sur un modèle de régression ajusté, des paramètres fournis par l'enseignant / créateur ou des paramètres fournis par l'élève / utilisateur.

La fonction créée peut également être facilement utilisée dans les simulations (avec la replicatecommande) pour explorer la puissance, la taille de l'échantillon, la taille de l'effet, etc. Bien que la simulation résultante puisse être plus lente que la fabrication manuelle du processus de simulation.

Cela ressemble à ce que vous décrivez à l'exception qu'il ne prend pas de valeurs p pour créer les données, mais l'utilisation de power.fonctions ou pwr.du pwrpackage peut être incorporée pour créer des simulations basées sur la spécification de la puissance et de l'alpha plutôt que sur les moyennes et les différences.

Voici un exemple de la page d'aide (il y a plusieurs autres exemples) qui suppose que vous mesurez les hauteurs de sujets (hommes et femmes) qui sont imbriqués dans des villes qui sont imbriquées dans des États, il y a un effet aléatoire pour l'État avec un SD de 1 et un effet aléatoire pour la ville (dans l'état) avec un écart-type de 0,5, puis l'écart-type «erreur» est de 3, les femmes ont une moyenne de simulation de 64 pouces et les hommes ont une moyenne de 69 pouces (l'erreur SD et les moyens sont réalistes , les effets aléatoires sont un peu artificiels). La simfunfonction est utilisée pour créer une nouvelle fonction appelée simheight, puis une trame de données est créée avec les identifiants d'état, les identifiants de ville et une colonne pour le sexe du sujet (le plan expérimental ou le plan d'échantillonnage), ceci est transmis àsimheight et le résultat dans un nouveau bloc de données avec les hauteurs simulées (en plus des autres variables) qui pourraient ensuite être analysées à l'aide des outils appropriés.

# 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
la source
Je n'arrive pas à trouver les nouveaux TeachingDemos sur R-Forge?
Etienne Low-Décarie
1
install.packages ("TeachingDemos", repos = " R-Forge.R-project.org" )
Etienne Low-Décarie
Essayez install.packages("TeachingDemos", repos="http://R-Forge.R-project.org"). Vous avez besoin de "http: //" au début et non de ";".
Greg Snow
3

Dactylographie methods(simulate) ou getAnywhere("simulate")devrait fonctionner. Le premier vous donne quelques méthodes, si le paquet lme4 est chargé:

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

Les objets Lm sont utilisés pour les modèles lm et glm.

JTT
la source
2
Merci, mais cela semble être la réponse de @ Momo.
Etienne Low-Décarie