Czy dostępna jest ogólna metoda symulowania danych ze wzoru lub analizy?

16

De novo symulacja danych z eksperymentalnej ramki danych projektowych.
Z naciskiem na R (choć inne rozwiązanie językowe byłoby świetne).

Podczas projektowania eksperymentu lub ankiety symulowanie danych i przeprowadzanie analizy tych symulowanych danych może zapewnić świetny wgląd w zalety i wady projektu.

Takie podejście może być również niezbędne do zrozumienia i właściwego wykorzystania testów statystycznych.

Proces ten bywa jednak nieco żmudny i wiele osób musi pominąć ten ważny krok w eksperymencie lub ankiecie.

Modele statystyczne i test zawierają większość informacji wymaganych do symulacji danych (w tym założenie lub wyraźne stwierdzenie rozkładu).

Biorąc pod uwagę model analizy (i związane z nim założenia, np. Normalność i równowaga), poziomy czynnika i miarę istotności (takie jak wartość p), chciałbym uzyskać dane symulowane (najlepiej z uogólnioną funkcją zbliżoną do print (), przewiduj (), symuluj ()).

Czy takie ogólne ramy symulacji są możliwe?

Jeśli tak, czy takie ramy są obecnie dostępne?

Przykład, chciałbym funkcji, takiej jak:

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

tj. uogólniona wersja:

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

LUB

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

LUB

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

które tworzyłoby kompletne odpowiednie data.frame

potencjalne przykłady konkretnych funkcji (proszę edytować do woli)
- arima.sim

istnieje funkcja tworzenia ramki danych poziomów czynników, bez modelowanej odpowiedzi:
np. conf.design
http://cran.r-project.org/web/views/ExperimentalDesign.html

Etienne Low-Décarie
źródło
Należy pamiętać, że należy określić rozkład błędów. Ponadto nie śledzę całkowicie twoich list „p.values” lub „F_value”; czy jest pomysł, aby rozkłady próbkowania F i p były wyśrodkowane na podanych liczbach?
gung - Przywróć Monikę
@gung, rozkład jest przyjmowany w teście (oba tutaj zakładają normalność, inaczej musiałbym użyć czegoś takiego jak glm).
Etienne Low-Décarie
Testy na pewno nie zakładamy rozkład specyficzny, ale to nie oznacza, że dane zostały faktycznie wyprodukowanej w ten sposób. Możesz generować dane z dowolnej liczby dystrybucji do różnych celów (np. Badania symulacyjne, niezawodność itp.).
gung - Przywróć Monikę
@ Gung, próbowałem edytować moje pytanie, aby wyjaśnić, że chcę utworzyć zestaw danych, który odpowiada oczekiwaniom testu / modelu. Nie szukam czegoś do badań symulacyjnych ani do badania odporności, ale aby zapewnić próbę eksperymentalną.
Etienne Low-Décarie

Odpowiedzi:

10

W rzeczywistości istnieje generyczny S3, simulatektóry zwraca nawet żądaną ramkę danych (lub inną listę). Rodzaj

?simulate  

Ma już metody dla klas lm (działa również dla glm lub twojego przykładu aov) i glm.nb (w MASS). Możesz teraz pisać simulatemetody S3 dla innych klas obiektów, np. Dla obiektów z lme4. Możesz sprawdzić, które klasy są dostępne, pisząc

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

lub

getS3method("simulate","class"), methods(simulate) 
Momo
źródło
symulacja byłaby świetna, gdyby nie wymagała „obiektu reprezentującego dopasowany model”, który sam już wymaga danych lub danych symulowanych.
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
Zawsze można zbudować początkowo dopasowany obiekt ze wszystkimi wartościami odpowiedzi równymi 0, powiedzmy, i zastąpić współczynniki dopasowania dopasowanymi pożądanymi wartościami parametrów. Następnie symulowane odpowiedzi można uzyskać za pomocą „symulacji”.
NRH
To prawda. Pakiety w widoku [eksperymentalne zadanie projektowe] ( cran.r-project.org/web/views/ExperimentalDesign.html ) mają wiele pakietów do utworzenia konfiguracji zmiennej zastępczej . Świetnie byłoby zintegrować symulacyjne i eksperymentalne funkcje projektowe!
Etienne Low-Décarie
Niektóre funkcje symulacyjne nie tworzą danych tylko dla dopasowania: stats.stackexchange.com/questions/11233/…
Etienne Low-Décarie
6

Istnieje nowa funkcja wywoływana simfunwTeachingDemos pakiecie dla R (jest to obecnie tylko w wersji rozwojowej na R-kuźni , to będzie trochę czasu, zanim to jest na CRAN). Ma on pomóc w tworzeniu funkcji do przeprowadzania symulacji.

Jednym z zamierzonych zastosowań jest użycie przez nauczyciela simfunfunkcja do tworzenia funkcji i rozpowszechniania jej wśród studentów (ewentualnie może mieć interfejs internetowy w pewnym momencie jako alternatywa). Następnie uczniowie utworzyli ramkę danych czynników reprezentujących projekt eksperymentalny, przekazali tę ramkę danych do utworzonej funkcji i otrzymali ramkę danych z dodatkową kolumną odpowiedzi symulowaną zgodnie z parametrami i rozkładem błędów ustawionym przez nauczyciela , uczeń może następnie przeanalizować dane. Pozwala to nauczycielowi na ustanowienie „prawdziwej” relacji, ale pozwala uczniom wypróbować wiele różnych projektów eksperymentalnych w celu zbadania sposobów dotarcia do „Prawdy” w znacznie krótszym czasie niż wykonanie rzeczywistego eksperymentu i wymagającego mniej pracy dla nauczyciela niż utwórz lub znajdź kilka różnych przykładowych zestawów danych reprezentujących różne możliwe projekty.

Ta simfunfunkcja ma być elastyczna, aby nauczyciel / twórca mógł oprzeć symulacje na dopasowanym modelu regresji, parametrach dostarczonych przez nauczyciela / twórcę lub parametrach dostarczonych przez ucznia / użytkownika.

Utworzoną funkcję można również łatwo wykorzystać w symulacjach (za pomocą replicatepolecenia) w celu zbadania mocy, wielkości próbki, wielkości efektu itp. Chociaż uzyskana symulacja może być wolniejsza niż ręczne wykonanie procesu symulacji.

To wygląda na to, co można opisać z tym wyjątkiem, że nie mają wartości p do tworzenia danych, ale korzystanie z power.funkcji lub pwr.z pwrpakietu mogą być włączone do tworzenia symulacji w oparciu o określenie siły i alfa niż środki i różnice.

Oto przykład ze strony pomocy (istnieje kilka innych przykładów), który zakłada, że ​​mierzysz wysokości przedmiotów (mężczyzn i kobiet) zagnieżdżonych w miastach zagnieżdżonych w stanach, dla stanu z SD występuje losowy efekt 1 i losowy efekt dla miasta (w obrębie stanu) z SD równą 0,5, wtedy „błąd” SD wynosi 3, kobiety mają średnią symulacyjną 64 cali, a mężczyźni mają średnią 69 cali (błąd SD i średnie są realistyczne , efekty losowe są nieco wymyślone). Ta simfunfunkcja służy do tworzenia nowej funkcji o nazwie simheight, a następnie tworzona jest ramka danych z identyfikatorami stanów, identyfikatorami miast i kolumną dla płci badanego (projekt eksperymentalny lub projekt próbkowania), który jest przekazywany dosimheight w wyniku czego powstaje nowa ramka danych z symulowanymi wysokościami (oprócz innych zmiennych), którą można następnie przeanalizować za pomocą odpowiednich narzędzi.

# 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
źródło
Nie mogę znaleźć nowego TeachingDemos na R-Forge?
Etienne Low-Décarie
1
install.packages („TeachingDemos”, repos = „ R-Forge.R-project.org” )
Etienne Low-Décarie
Spróbować install.packages("TeachingDemos", repos="http://R-Forge.R-project.org"). Potrzebujesz „http: //” na początku i nie „;”.
Greg Snow,
3

Wpisywanie methods(simulate)lub getAnywhere("simulate")powinno działać. Ten pierwszy daje kilka metod, jeśli załadowany jest pakiet lme4:

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

Obiekty Lm są używane zarówno w modelach LM, jak i GLM.

JTT
źródło
2
Dzięki, ale to wydaje się być odpowiedzią @ Momo.
Etienne Low-Décarie