¿Existe un método general para simular datos de una fórmula o análisis disponible?

16

Simulación de novo de datos de un marco de datos de diseño experimental.
Con un enfoque en R (aunque otra solución de lenguaje sería genial).

Al diseñar un experimento o una encuesta, simular datos y realizar un análisis de estos datos simulados puede proporcionar una excelente visión de las ventajas y debilidades del diseño.

Tal enfoque también puede ser esencial para la comprensión y el uso adecuado de las pruebas estadísticas.

Sin embargo, este proceso tiende a ser algo tedioso y muchos se ven obligados a saltarse este importante paso en un experimento o encuesta.

Los modelos estadísticos y las pruebas contienen la mayor parte de la información requerida para simular los datos (incluyendo una suposición o una declaración explícita de la distribución).

Dado un modelo de análisis (y sus supuestos asociados, por ejemplo, normalidad y equilibrio), los niveles de un factor y una medida de significación (como el valor p), me gustaría obtener datos simulados (idealmente con una función generalizada similar a print (), predic (), simulate ()).

¿Es posible un marco de simulación tan generalizado?

Si es así, ¿está disponible actualmente ese marco?

Ejemplo, me gustaría una función, como:

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

es decir, una versión generalizada 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)}

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

eso crearía un completo data.frame correspondiente

ejemplos potenciales de funciones específicas (edite a voluntad)
- arima.sim

La función existe para crear un marco de datos de los niveles de factores, sin la respuesta modelada:
por ejemplo. conf.design
http://cran.r-project.org/web/views/ExperimentalDesign.html

Etienne Low-Décarie
fuente
Una cosa a tener en cuenta es que debe especificar una distribución de errores. Además, no sigo completamente sus listas de "valores p" o "F_value"; ¿Es la idea de que las distribuciones de muestreo de F & p se centren en los números enumerados?
gung - Restablece a Monica
@gung, la distribución se supone en la prueba (ambos aquí suponen normalidad o habría tenido que usar algo como glm).
Etienne Low-Décarie
La prueba ciertamente asume una distribución específica, pero eso no significa que los datos realmente se generaron de esa manera. Puede generar datos de cualquier número de distribuciones para diversos fines (por ejemplo, estudios de simulación, robustez, etc.).
gung - Restablece a Monica
@gung, he intentado editar mi pregunta para dejar en claro que quiero crear un conjunto de datos que se corresponda con las expectativas de la prueba / modelo. No estoy buscando algo para un estudio de simulación o para un estudio de robustez, sino para proporcionar una ejecución en seco de un diseño experimental.
Etienne Low-Décarie

Respuestas:

10

En realidad, hay un genérico S3 simulateque incluso devuelve el marco de datos (u otra lista) que desee. Tipo

?simulate  

Tiene métodos para las clases lm (funciona también para glm o para su ejemplo aov) y glm.nb (en MASS) ya. Ahora puede escribir simulatemétodos S3 para otras clases de objetos, por ejemplo, para objetos de lme4. Puede verificar para qué clases hay métodos escribiendo

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

o

getS3method("simulate","class"), methods(simulate) 
Momo
fuente
simular sería genial si no requiriera "un objeto que represente un modelo ajustado" que ya requiere datos o datos simulados.
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
Siempre se podría construir un objeto ajustado inicial con todos los valores de respuesta siendo 0, por ejemplo, y reemplazar los coeficientes en el ajuste con los valores de los parámetros deseados. Entonces se pueden obtener respuestas simuladas usando 'simular'.
NRH
Eso es verdad. Los paquetes de la vista [tarea de diseño experimental] ( cran.r-project.org/web/views/ExperimentalDesign.html ) tienen muchos paquetes para crear la configuración de variable ficticia. ¡Integrar las funciones de diseño simulado y experimental sería genial!
Etienne Low-Décarie
Algunas funciones de simulación no crean los datos solo el ajuste: stats.stackexchange.com/questions/11233/…
Etienne Low-Décarie
6

Hay una nueva función llamada simfunen el TeachingDemospaquete para R (actualmente solo está en la versión de desarrollo en R-forge , pasará un tiempo antes de que esté en CRAN). Su objetivo es ayudar con la creación de funciones para hacer simulaciones.

Uno de los usos previstos es que un maestro usaría el simfunfunción para crear una función y distribuirla a los estudiantes (posiblemente tenga una interfaz web en algún momento como alternativa). Luego, los estudiantes crearán un marco de datos de los factores que representan un diseño experimental, pasarán este marco de datos a la función creada y obtendrán el marco de datos con una columna adicional de la respuesta simulada de acuerdo con los parámetros y la distribución de errores configurados por el profesor , el alumno puede analizar los datos. Esto le permite al maestro establecer una relación "Verdadera", pero les permite a los estudiantes probar muchos diseños experimentales diferentes para explorar formas de llegar a la "Verdad" en mucho menos tiempo que hacer un experimento real y requerir menos trabajo para el maestro que cree o encuentre un conjunto de diferentes conjuntos de datos de muestra que representen los diferentes diseños posibles.

La simfunfunción está diseñada para ser flexible para que el maestro / creador pueda basar las simulaciones en un modelo de regresión ajustado, parámetros proporcionados por el maestro / creador o parámetros suministrados por el alumno / usuario.

La función creada también se puede usar fácilmente en simulaciones (con el replicatecomando) para explorar la potencia, el tamaño de la muestra, el tamaño del efecto, etc. Aunque la simulación resultante puede ser más lenta que la elaboración manual del proceso de simulación.

Esto se parece a lo que describe con la excepción de que no se necesitan valores p para crear los datos, pero el uso de power.funciones o pwr.del pwrpaquete podría incorporarse para crear simulaciones basadas en la especificación de potencia y alfa en lugar de medios y diferencias.

Aquí hay un ejemplo de la página de ayuda (hay varios ejemplos más) que asume que está midiendo alturas de sujetos (hombres y mujeres) que están anidados en ciudades que están anidadas en estados, hay un efecto aleatorio para el estado con un SD de 1 y un efecto aleatorio para la ciudad (dentro del estado) con un SD de 0.5, entonces el "error" SD es 3, las mujeres tienen una media de simulación de 64 pulgadas y los hombres tienen una media de 69 pulgadas (el error SD y las medias son realistas , los efectos aleatorios son un poco artificiales). La simfunfunción se usa para crear una nueva función llamada simheight, luego se crea un marco de datos con ID de estado, ID de ciudad y una columna para el sexo del sujeto (diseño experimental o diseño de muestreo), esto se pasa asimheight y el resultado en un nuevo marco de datos con las alturas simuladas (además de las otras variables) que luego podrían analizarse utilizando las herramientas apropiadas.

# 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
fuente
¿Parece que no puedo encontrar el nuevo TeachingDemos en R-Forge?
Etienne Low-Décarie
1
install.packages ("TeachingDemos", repos = " R-Forge.R-project.org" )
Etienne Low-Décarie
Tratar install.packages("TeachingDemos", repos="http://R-Forge.R-project.org"). Necesita "http: //" al principio y no ";".
Greg Snow
3

Mecanografía methods(simulate)o getAnywhere("simulate")debería funcionar. El primero le ofrece algunos métodos, si se carga el paquete lme4:

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

Los objetos Lm se usan para los modelos lm y glm.

JTT
fuente
2
Gracias, pero esta parece ser la respuesta de @ Momo.
Etienne Low-Décarie