Pertanyaan ini dimotivasi oleh pertanyaan saya tentang meta-analisis . Tapi saya membayangkan bahwa itu juga akan berguna dalam konteks pengajaran di mana Anda ingin membuat dataset yang persis mencerminkan dataset yang sudah ada diterbitkan.
Saya tahu cara menghasilkan data acak dari distribusi yang diberikan. Jadi misalnya, jika saya membaca tentang hasil studi yang memiliki:
- rata-rata 102,
- standar deviasi 5,2, dan
- ukuran sampel 72.
Saya bisa menghasilkan data serupa menggunakan rnorm
dalam R. Misalnya,
set.seed(1234)
x <- rnorm(n=72, mean=102, sd=5.2)
Tentu saja mean dan SD tidak akan persis sama dengan 102 dan 5.2 masing-masing:
round(c(n=length(x), mean=mean(x), sd=sd(x)), 2)
## n mean sd
## 72.00 100.58 5.25
Secara umum saya tertarik pada bagaimana mensimulasikan data yang memenuhi serangkaian kendala. Dalam kasus di atas, kendala adalah ukuran sampel, rata-rata, dan standar deviasi. Dalam kasus lain, mungkin ada kendala tambahan. Sebagai contoh,
- minimum dan maksimum dalam data atau variabel yang mendasarinya mungkin diketahui.
- variabel mungkin diketahui hanya mengambil nilai integer atau hanya nilai-nilai non-negatif.
- data mungkin mencakup banyak variabel dengan inter-korelasi yang diketahui.
Pertanyaan
- Secara umum, bagaimana saya bisa mensimulasikan data yang benar-benar memenuhi serangkaian kendala?
- Apakah ada artikel yang ditulis tentang ini? Apakah ada program di R yang melakukan ini?
- Sebagai contoh, bagaimana saya bisa mensimulasikan variabel sehingga memiliki rata-rata dan sd tertentu?
sumber
x<-rnorm(72);x<-5.2*(x-mean(x))/sd(x)+102
lakukan triknya.Jawaban:
Secara umum, untuk membuat mean dan varians sampel Anda persis sama dengan nilai yang ditentukan sebelumnya, Anda dapat dengan tepat menggeser dan menskalakan variabel. Secara khusus, jika adalah sampel, maka variabel baruX1, X2, . . . , Xn
di mana adalah mean sampel dans 2 X =1X¯¯¯¯= 1n∑ni = 1Xsaya adalah varians sampel adalah seperti bahwa mean sampel dariZi's persisc2dan varians sampel mereka adalah persisc1. Contoh yang dibuat serupa dapat membatasi rentang -s2X= 1n - 1∑ni = 1( Xsaya- X¯¯¯¯)2 Zsaya c2 c1
akan menghasilkan kumpulan data yang terbatas pada interval ( a , b ) .B1, . . . , Bn ( a , b )
Catatan: Jenis pemindahan / penskalaan ini akan, secara umum, mengubah keluarga distribusi data, bahkan jika data asli berasal dari keluarga skala lokasi.
Dalam konteks distribusi normal ,
mvrnorm
fungsi inR
memungkinkan Anda untuk mensimulasikan data normal (atau multivarian normal) dengan sampel rata-rata / kovarians sampel dengan menetapkanempirical=TRUE
. Secara khusus, fungsi ini mensimulasikan data dari distribusi kondisional dari variabel yang terdistribusi normal, mengingat rerata sampel dan (co) varians sama dengan nilai yang ditentukan sebelumnya . Perhatikan bahwa distribusi marjinal yang dihasilkan tidak normal, seperti yang ditunjukkan oleh @whuber dalam komentar untuk pertanyaan utama.Berikut adalah contoh univariat sederhana di mana mean sampel (dari sampel ) dibatasi menjadi 0 dan standar deviasi sampel adalah 1. Kita dapat melihat bahwa elemen pertama jauh lebih mirip dengan distribusi seragam daripada normal. distribusi:n = 4
sumber
Mengenai permintaan Anda untuk makalah, ada:
Ini bukan apa yang Anda cari, tetapi mungkin berfungsi sebagai gandum bagi pabrik.
Ada strategi lain yang tampaknya tidak ada yang disebutkan. Dimungkinkan untuk menghasilkan data acak (pseudo) dari satu set ukuran N sehingga seluruh set memenuhi kendala k selama data k yang tersisa ditetapkan pada nilai yang sesuai. Nilai yang diperlukan harus dipecahkan dengan sistem persamaan k , aljabar, dan beberapa minyak siku.N- k N k k k
Misalnya, untuk menghasilkan satu set data dari distribusi normal yang akan memiliki rata-rata sampel yang diberikan, ˉ xN x¯ , dan varians, , Anda harus memperbaiki nilai dua titik: y dan z . Karena rata-rata sampel adalah: ˉ x = Σ N - 2 i = 1 x is2 y z
yharus: y=N ˉ x
R
Kedua, sedangkan standardisasi membuat distribusi marginal dari semua varian Anda lebih seragam, pendekatan ini hanya memengaruhi dua nilai terakhir, tetapi membuat distribusi marginalnya miring:
Ketiga, sampel yang dihasilkan mungkin tidak terlihat sangat normal; mungkin terlihat seperti memiliki 'outlier' (yaitu, poin yang berasal dari proses pembuatan data yang berbeda dari yang lain), karena pada dasarnya itulah masalahnya. Ini cenderung menjadi masalah dengan ukuran sampel yang lebih besar, karena statistik sampel dari data yang dihasilkan harus menyatu dengan nilai-nilai yang diperlukan dan dengan demikian membutuhkan penyesuaian yang lebih sedikit. Dengan sampel yang lebih kecil, Anda selalu bisa menggabungkan pendekatan ini dengan algoritma terima / tolak yang mencoba lagi jika sampel yang dihasilkan memiliki statistik bentuk (misalnya, skewness dan kurtosis) yang berada di luar batas yang dapat diterima (lih., Komentar @ cardinal ), atau memperluas pendekatan ini untuk menghasilkan sampel dengan mean tetap, varians, skewness, dankurtosis (saya akan membiarkan aljabar terserah Anda). Atau, Anda dapat menghasilkan sejumlah kecil sampel dan menggunakan sampel dengan statistik Kolmogorov-Smirnov terkecil.
sumber
Teknik umum adalah 'Metode Penolakan', di mana Anda hanya menolak hasil yang tidak memenuhi kendala Anda. Kecuali jika Anda memiliki semacam panduan (seperti MCMC), maka Anda bisa menghasilkan banyak kasus (tergantung pada skenario Anda) yang ditolak!
Di mana Anda mencari sesuatu seperti mean dan deviasi standar dan Anda dapat membuat metrik jarak semacam untuk mengatakan seberapa jauh Anda jauh dari tujuan Anda, Anda dapat menggunakan optimasi untuk mencari variabel input yang memberikan Anda output yang diinginkan nilai-nilai.
Sebagai contoh jelek di mana kita akan mencari vektor seragam acak dengan panjang 100 yang memiliki mean = 0 dan standar deviasi = 1.
sumber
Itu Runuran R berisi banyak metode untuk menghasilkan variasi acak. Ia menggunakan C library dari proyek UNU.RAN (Universal Non-Uniform RAndom Number generator) proyek. Pengetahuan saya sendiri tentang bidang pembuatan varian acak terbatas, tetapi sketsa Runuran memberikan gambaran yang bagus. Di bawah ini adalah metode yang tersedia dalam paket Runuran, diambil dari sketsa:
Distribusi berkelanjutan:
Distribusi terpisah:
Distribusi multivarian:
Contoh:
Sebagai contoh cepat, misalkan Anda ingin menghasilkan distribusi normal yang dibatasi antara 0 dan 100:
The
urnorm()
fungsi fungsi pembungkus nyaman. Saya percaya bahwa di balik layar menggunakan Interpolasi Polinomial metode Invers CDF tetapi saya tidak yakin. Untuk sesuatu yang lebih kompleks, katakanlah, distribusi Normal diskrit dibatasi antara 0 dan 100:sumber
Tampaknya ada paket R yang memenuhi kebutuhan Anda yang baru diterbitkan kemarin! simstudy Oleh Keith Goldfeld
sumber
sumber
Jawaban ini mempertimbangkan pendekatan lain untuk kasus di mana Anda ingin memaksa variates untuk berada dalam rentang yang ditentukan dan tambahan menentukan rata-rata dan / atau varians.
Perhatikan bahwa ini mungkin terlihat sedikit beta, tetapi sebenarnya tidak.
sumber
Dalam jawaban saya di sini , saya mencantumkan tiga paket R untuk melakukan ini:
sumber