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


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) 

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)

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.


2
Dzięki, ale to wydaje się być odpowiedzią @ Momo.
— Etienne Low-Décarie
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.