Existe um método geral para simular dados de uma fórmula ou análise disponível?

16

Simulação de novo de dados a partir de um quadro de dados de projeto experimental.
Com foco em R (embora outra solução de idioma seja ótima).

Ao projetar um experimento ou uma pesquisa, a simulação de dados e a realização de uma análise desses dados simulados podem fornecer informações excelentes sobre as vantagens e fraquezas do projeto.

Essa abordagem também pode ser essencial para a compreensão e uso adequado dos testes estatísticos.

No entanto, esse processo tende a ser um pouco tedioso e muitos são levados a pular essa importante etapa de um experimento ou pesquisa.

Os modelos e testes estatísticos contêm a maioria das informações necessárias para simular os dados (incluindo uma suposição ou uma declaração explícita da distribuição).

Dado um modelo de análise (e suas suposições associadas, por exemplo, normalidade e equilíbrio), os níveis de um fator e uma medida de significância (como valor-p), eu gostaria de obter dados simulados (idealmente com uma função generalizada semelhante a imprimir (), prever (), simular ()).

É possível uma estrutura de simulação tão generalizada?

Em caso afirmativo, essa estrutura está disponível atualmente?

Exemplo, eu gostaria de uma função, 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")))

ou seja, uma versão 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)}

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

que criaria um data.frame correspondente completo

exemplos potenciais de funções específicas (edite à vontade)
- arima.sim

existe uma função para criar um quadro de dados dos níveis dos fatores, sem a resposta modelada:
por exemplo, conf.design
http://cran.r-project.org/web/views/ExperimentalDesign.html

Etienne Low-Décarie
fonte
Uma coisa a ter em mente é que você precisa especificar uma distribuição de erros. Além disso, não sigo completamente suas listas "p.values" ou "F_value"; é a idéia de que as distribuições amostrais de F & p estejam centradas nos números listados?
gung - Restabelece Monica
@gung, a distribuição é assumida no teste (ambos aqui assumem normalidade ou eu teria que usar algo como glm).
Etienne Low-Décarie
O teste certamente assume uma distribuição específica, mas isso não significa que os dados foram realmente gerados dessa maneira. Você pode gerar dados de qualquer número de distribuições para vários propósitos (por exemplo, estudos de simulação, robustez etc.).
gung - Restabelece Monica
@gung, tentei editar minha pergunta para deixar claro que quero criar um conjunto de dados que corresponda às expectativas do teste / modelo. Não estou procurando algo para um estudo de simulação ou um estudo de robustez, mas para fornecer uma descrição a seco de um projeto experimental.
Etienne Low-Décarie

Respostas:

10

Na verdade, existe um S3 genérico simulateque até retorna o quadro de dados (ou outra lista) que você deseja. Tipo

?simulate  

Já possui métodos para as classes lm (funciona também para glm ou para seu exemplo aov) e glm.nb (no MASS). Agora você pode escrever simulatemétodos S3 para outras classes de objetos, por exemplo, para objetos do lme4. Você pode verificar quais classes existem métodos digitando

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

ou

getS3method("simulate","class"), methods(simulate) 
Momo
fonte
Simular seria ótimo se não exigisse "um objeto representando um modelo ajustado", que já requer dados ou dados 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
Pode-se sempre construir um objeto ajustado inicial com todos os valores de resposta sendo 0, digamos, e substituir os coeficientes no ajuste pelos valores desejados dos parâmetros. Em seguida, respostas simuladas podem ser obtidas usando 'simular'.
NRH 16/05/12
Isso é verdade. Os pacotes na exibição [tarefa de design experimental] ( cran.r-project.org/web/views/ExperimentalDesign.html ) possuem muitos pacotes para criar a configuração da variável dummy. Integrar as funções de design simulado e experimental seria ótimo!
Etienne Low-Décarie
Algumas funções simulados não criar os dados apenas o ajuste: stats.stackexchange.com/questions/11233/...
Etienne Low-Décarie
6

Há uma nova função chamada simfunno TeachingDemospacote para R (atualmente ela está apenas na versão de desenvolvimento no R-forge , levará um tempo até que esteja no CRAN). Destina-se a ajudar na criação de funções para fazer simulações.

Um dos usos pretendidos é que um professor usaria o simfunfunction para criar uma função e distribuí-la aos alunos (possivelmente tenha uma interface da web em algum momento como alternativa). Os alunos criariam um quadro de dados dos fatores que representam um projeto experimental, passariam esse quadro de dados para a função criada e receberiam o quadro de dados com uma coluna adicional da resposta simulada de acordo com os parâmetros e a distribuição de erros configurados pelo professor , o aluno pode analisar os dados. Isso permite que o professor estabeleça um relacionamento "Verdadeiro", mas permite que os alunos tentem muitos projetos experimentais diferentes para explorar maneiras de alcançar a "Verdade" em muito menos tempo do que fazer um experimento real e exigir menos trabalho para o professor do que crie ou encontre vários conjuntos de dados de amostra diferentes, representando os diferentes designs possíveis.

A simfunfunção foi projetada para ser flexível, de modo que o professor / criador possa basear as simulações em um modelo de regressão adequado, parâmetros fornecidos pelo professor / criador ou parâmetros fornecidos pelo aluno / usuário.

A função criada também pode ser facilmente usada em simulações (com o replicatecomando) para explorar potência, tamanho da amostra, tamanho do efeito, etc. Embora a simulação resultante possa ser mais lenta que a elaboração manual do processo de simulação.

Isso se parece com o que você descreve, com a exceção de que não são necessários valores-p para criar os dados, mas o uso de power.funções ou pwr.do pwrpacote pode ser incorporado para criar simulações com base na especificação de poder e alfa, em vez de meios e diferenças.

Aqui está um exemplo da página de ajuda (existem vários outros exemplos) que pressupõe que você está medindo alturas de sujeitos (masculino e feminino) aninhados em cidades aninhadas em estados; existe um efeito aleatório para um estado com um SD de 1 e um efeito aleatório para a cidade (dentro do estado) com um DP de 0,5, o SD "erro" é 3, as fêmeas têm uma média de simulação de 64 polegadas e os machos têm uma média de 69 polegadas (o erro SD e as médias são realistas , os efeitos aleatórios são um pouco artificial). A simfunfunção é usada para criar uma nova função chamada simheight, em seguida, um quadro de dados é criado com IDs de estado, IDs de cidade e uma coluna para o sexo do sujeito (o design experimental ou o design de amostragem), que é passado parasimheight e o resultado em um novo quadro de dados com as alturas simuladas (além das outras variáveis) que poderiam ser analisadas usando as ferramentas apropriadas.

# 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
fonte
Não consigo encontrar as novas Demonstrações Didáticas no R-Forge?
Etienne Low-Décarie
11
install.packages ("TeachingDemos", repos = " R-Forge.R-project.org" )
Etienne Low-Décarie
Tente install.packages("TeachingDemos", repos="http://R-Forge.R-project.org"). Você precisa de "http: //" no início e não ";".
Greg Neve
3

Digitando methods(simulate)ou getAnywhere("simulate")deve funcionar. O primeiro fornece alguns métodos, se o pacote lme4 estiver carregado:

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

Os objetos Lm são usados ​​para os modelos lm e glm.

JTT
fonte
2
Obrigado, mas isso parece ser a resposta do @ Momo.
Etienne Low-Décarie