Apakah ada metode umum untuk mensimulasikan data dari formula atau analisis yang tersedia?

16

Simulasi data de novo dari kerangka data desain eksperimental.
Dengan fokus pada R (meskipun solusi bahasa lain akan lebih bagus).

Dalam mendesain eksperimen atau survei, mensimulasikan data dan melakukan analisis pada data yang disimulasikan ini dapat memberikan wawasan yang hebat tentang kelebihan dan kelemahan desain.

Pendekatan semacam itu juga dapat menjadi sangat penting untuk memahami dan menggunakan uji statistik secara tepat.

Namun, proses ini cenderung agak menjemukan dan banyak yang dipimpin untuk melewati langkah penting ini dalam percobaan atau survei.

Model dan uji statistik berisi sebagian besar informasi yang diperlukan untuk mensimulasikan data (termasuk asumsi atau pernyataan distribusi yang eksplisit).

Diberikan model analisis (dan asumsi yang terkait misalnya normalitas dan keseimbangan), tingkat faktor dan ukuran signifikansi (seperti nilai-p), saya ingin mendapatkan data simulasi (idealnya dengan fungsi umum seperti cetak (), prediksi (), simulasikan ()).

Apakah kerangka kerja simulasi umum seperti itu mungkin?

Jika demikian, apakah kerangka kerja seperti itu saat ini tersedia?

Contoh, saya ingin fungsi, seperti:

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

yaitu, versi umum dari:

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

ATAU

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

ATAU

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

yang akan membuat data.frame yang sesuai lengkap

contoh potensial fungsi spesifik (harap sunting sesuka hati)
- arima.sim

fungsi ada untuk membuat data.frame tingkat faktor, tanpa respons yang dimodelkan:
misalnya. conf.design
http://cran.r-project.org/web/views/ExperimentalDesign.html

Etienne Low-Décarie
sumber
Satu hal yang perlu diingat adalah bahwa Anda perlu menentukan distribusi kesalahan. Selain itu, saya tidak sepenuhnya mengikuti daftar "p.values" atau "F_value" Anda; Apakah gagasan bahwa distribusi sampel F&P berpusat pada angka-angka yang tercantum?
gung - Reinstate Monica
@ung, distribusi diasumsikan dalam tes (baik di sini mengasumsikan normal atau saya harus menggunakan sesuatu seperti glm).
Etienne Low-Décarie
The uji tentu tidak menganggap distribusi tertentu, tetapi itu tidak berarti bahwa data benar-benar dihasilkan dengan cara itu. Anda dapat menghasilkan data dari sejumlah distribusi untuk berbagai tujuan (misalnya, studi simulasi, ketahanan, dll.).
gung - Reinstate Monica
@ung, saya telah mencoba mengedit pertanyaan saya untuk menjelaskan bahwa saya ingin membuat set data yang sesuai dengan harapan tes / model. Saya tidak mencari sesuatu untuk studi simulasi atau untuk studi ketahanan, tetapi untuk memberikan desain eksperimental yang kering.
Etienne Low-Décarie

Jawaban:

10

Sebenarnya ada S3 generik simulateyang bahkan mengembalikan bingkai data (atau daftar lainnya) yang Anda inginkan. Tipe

?simulate  

Ini memiliki metode untuk kelas lm (berfungsi juga untuk glm atau untuk contoh aov Anda) dan glm.nb (dalam MASS) sudah. Anda sekarang dapat menulis simulatemetode S3 untuk kelas objek lain, misalnya untuk objek dari lme4. Anda dapat memeriksa kelas mana yang ada metode dengan mengetik

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

atau

getS3method("simulate","class"), methods(simulate) 
Momo
sumber
mensimulasikan akan bagus jika tidak memerlukan "objek yang mewakili model yang pas" yang itu sendiri sudah membutuhkan data atau data simulasi.
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
Seseorang selalu dapat membangun objek yang dipasang awal dengan semua nilai respons menjadi 0, katakan, dan ganti koefisien yang sesuai dengan nilai parameter yang diinginkan. Kemudian respons yang disimulasikan dapat diperoleh dengan menggunakan 'simulasi'.
NRH
Itu benar. Paket dalam tampilan [tugas desain eksperimental] ( cran.r-project.org/web/views/ExperimentalDesign.html ) memiliki banyak paket untuk membuat pengaturan variabel dummy. Mengintegrasikan fungsi desain simulasi dan eksperimental akan sangat bagus!
Etienne Low-Décarie
Beberapa fungsi simulasi tidak hanya membuat data sesuai: stats.stackexchange.com/questions/11233/…
Etienne Low-Décarie
6

Ada fungsi baru yang disebut simfundalam TeachingDemospaket untuk R (saat ini hanya dalam versi pengembangan pada R-forge , itu akan menjadi beberapa saat sebelum ada di CRAN). Ini dimaksudkan untuk membantu menciptakan fungsi untuk melakukan simulasi.

Salah satu kegunaan yang dimaksudkan adalah bahwa seorang guru akan menggunakan simfunberfungsi untuk membuat fungsi dan mendistribusikannya kepada siswa (mungkin memiliki antarmuka web di beberapa titik sebagai alternatif). Para siswa kemudian akan membuat bingkai data dari faktor-faktor yang mewakili desain eksperimental, meneruskan bingkai data ini ke fungsi yang dibuat dan mendapatkan kembali bingkai data dengan kolom tambahan dari respon yang disimulasikan sesuai dengan parameter dan distribusi kesalahan yang diatur oleh guru. , siswa kemudian dapat menganalisis data. Hal ini memungkinkan guru untuk mengatur hubungan "Benar", tetapi memungkinkan siswa untuk mencoba banyak desain eksperimental yang berbeda untuk mengeksplorasi cara untuk mendapatkan "Kebenaran" dalam waktu yang jauh lebih sedikit daripada melakukan percobaan yang sebenarnya dan membutuhkan lebih sedikit pekerjaan untuk guru daripada untuk membuat atau menemukan sekelompok dataset sampel berbeda yang mewakili berbagai kemungkinan desain.

The simfunFungsi dirancang untuk menjadi fleksibel sehingga guru / pencipta dapat mendasarkan simulasi pada model regresi dipasang, parameter yang disediakan oleh guru / pencipta, atau parameter suplied oleh siswa / pengguna.

Fungsi yang dibuat juga dapat dengan mudah digunakan dalam simulasi (dengan replicateperintah) untuk mengeksplorasi daya, ukuran sampel, ukuran efek, dll. Meskipun simulasi yang dihasilkan mungkin lebih lambat daripada proses pembuatan simulasi secara manual.

Ini terlihat seperti apa yang Anda gambarkan dengan pengecualian bahwa tidak diperlukan nilai-p untuk membuat data, tetapi penggunaan power.fungsi atau pwr.dari pwrpaket dapat dimasukkan untuk membuat simulasi berdasarkan pada menentukan kekuatan dan alfa daripada cara dan perbedaan.

Berikut adalah contoh dari halaman bantuan (ada beberapa contoh lagi) yang mengasumsikan bahwa Anda mengukur ketinggian mata pelajaran (pria dan wanita) yang bersarang di kota-kota yang bersarang di negara bagian, ada efek acak untuk negara dengan SD. 1 dan efek acak untuk kota (dalam negara bagian) dengan SD 0,5 maka "kesalahan" SD adalah 3, perempuan memiliki rata-rata simulasi 64 inci dan laki-laki memiliki rata-rata 69 inci (kesalahan SD dan rata-rata realistis) , efek acak sedikit dibuat-buat). The simfunFungsi ini digunakan untuk membuat fungsi baru yang disebut simheight, maka data frame dibuat dengan ID negara, kota ID dan kolom untuk jenis kelamin subjek (desain percobaan atau sampel desain), ini akan dilewatkan kesimheight dan hasil dalam bingkai data baru dengan ketinggian yang disimulasikan (selain variabel lainnya) yang kemudian dapat dianalisis menggunakan alat yang sesuai.

# 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
sumber
Sepertinya saya tidak dapat menemukan TeachingDemos baru di R-Forge?
Etienne Low-Décarie
1
install.packages ("TeachingDemos", repos = " R-Forge.R-project.org" )
Etienne Low-Décarie
Coba install.packages("TeachingDemos", repos="http://R-Forge.R-project.org"). Anda perlu "http: //" di awal dan tidak ada ";".
Greg Snow
3

Mengetik methods(simulate)atau getAnywhere("simulate")harus bekerja. Yang pertama memberi Anda beberapa metode, jika paket lme4 dimuat:

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

Objek-lm digunakan untuk model lm dan glm.

JTT
sumber
2
Terima kasih, tapi ini sepertinya jawaban @ Momo.
Etienne Low-Décarie