Mensimulasikan data regresi dengan variabel dependen didistribusikan secara tidak normal


8

Untuk analisis regresi, seringkali berguna untuk mengetahui proses pembuatan data untuk memeriksa bagaimana metode yang digunakan bekerja. Meskipun cukup sederhana untuk melakukan ini untuk regresi linier sederhana, ini bukan kasus ketika variabel dependen harus mengikuti distribusi tertentu.

Pertimbangkan regresi linier sederhana:

N    <- 100
x    <- rnorm(N)
beta <- 3 + 0.4*rnorm(N)
y    <- 1 + x * beta + .75*rnorm(N)

Apakah ada cara untuk menggunakan pendekatan yang sama tetapi untuk ymenjadi selain normal, katakanlah condong ke kiri?

Jawaban:


10

Jika saya memahami pertanyaan Anda dengan benar, ini cukup mudah. Anda hanya perlu memutuskan distribusi apa yang Anda inginkan kesalahan Anda, dan menggunakan fungsi generasi acak yang sesuai.

Ada beberapa distribusi miring, jadi Anda perlu mencari tahu mana yang Anda suka. Selain itu, sebagian besar distribusi miring (misalnya, log normal, chi-squared, Gamma, Weibull, dll.) Condong ke kanan, sehingga beberapa adaptasi kecil akan diperlukan (misalnya, kalikan dengan1).

Berikut ini contoh memodifikasi kode Anda:

set.seed(5840)  # this makes the example exactly reproducible
N      <- 100
x      <- rnorm(N)
beta   <- 0.4
errors <- rlnorm(N, meanlog=0, sdlog=1)
errors <- -1*errors   # this makes them left skewed
errors <- errors - 1  # this centers the error distribution on 0
y      <- 1 + x*beta + errors

masukkan deskripsi gambar di sini

Saya harus mencatat pada titik ini bahwa regresi tidak membuat asumsi tentang distribusi X atau Y, hanya tentang kesalahan, ε(lihat di sini: Bagaimana jika residu terdistribusi normal, tetapi y tidak? ). Jadi, itulah fokus jawaban saya di atas.


Pembaruan: Ini adalah versi miring kanan dengan kesalahan didistribusikan sebagai Weibull:

set.seed(5840)  # this makes the example exactly reproducible
N      <- 100
x      <- rnorm(N)
beta   <- 0.4
errors <- rweibull(N, shape=1.5, scale=1)
# errors <- -1*errors   # this makes them left skewed
errors <- errors - factorial(1/1.5)  # this centers the error distribution on 0
y      <- 1 + x*beta + errors

Data Weibull sudah benar miring, jadi kita tidak perlu mengubah arahnya (yaitu, kita menjatuhkan -1*errorsbagian). Juga, dari halaman Wikipedia untuk distribusi Weibull, kita melihat bahwa rata-rata Weibull adalah:E[W]=(1/shape)!. Kami ingin mengurangi nilai itu dari masing-masing kesalahan sehingga distribusi kesalahan yang dihasilkan terpusat0. Itu memungkinkan bagian struktural (yaitu, 1 + x*beta) kode Anda untuk secara akurat mencerminkan bagian struktural dari proses pembuatan data.

masukkan deskripsi gambar di sini

The distribusi ExGaussian adalah jumlah normal dan eksponensial. Ada fungsi ? RexGAUS dalam paket gamlss.dist untuk menghasilkan ini. Saya tidak memiliki paket itu, tetapi Anda harus dapat mengadaptasi kode saya di atas tanpa terlalu banyak kesulitan. Anda juga bisa menghasilkan variabel normal acak (via rnorm()) dan eksponensial (via rexp()) dan menjumlahkannya dengan mudah. Ingatlah untuk mengurangi mean populasi,μ+1/λ, dari setiap kesalahan sebelum menambahkan kesalahan ke bagian struktural dari proses pembuatan data. (Berhati-hatilah untuk tidak mengurangi mean sampelmean(errors) !)


Beberapa komentar terakhir dan tidak terkait: Contoh kode Anda dalam pertanyaan agak kacau (artinya jangan tersinggung). Karena rnorm(N)menghasilkan data dengan mean=0dan sd=1secara default, 0.4*rnorm(N)akan menghasilkan rnorm(N, mean=0, sd=0.4). Kode Anda (dan mungkin pemikiran Anda) akan jauh lebih jelas jika Anda menggunakan formulasi yang terakhir. Selain itu, kode Anda untuk betatampaknya membingungkan. Kami biasanya memikirkanβdalam model tipe regresi sebagai parameter, bukan variabel acak. Artinya, ini adalah konstanta yang tidak diketahui yang mengatur perilaku proses pembuatan data, tetapi sifat stokastik dari proses tersebut dienkapsulasi oleh kesalahan. Ini bukan cara kami memikirkannya ketika kami bekerja dengan model multilevel, dan kode Anda tampaknya setengah antara model regresi standar dan kode untuk model regresi multilevel. Menentukan beta Anda secara terpisah adalah ide yang bagus untuk menjaga kejelasan konseptual kode, tetapi untuk model regresi standar, Anda hanya akan menetapkan satu angka untuk setiap beta (misalnya, beta0 <- 1; beta1 <- .04).


terima kasih atas jawaban Anda, untuk lebih spesifik: Saya perlu mensimulasikan data waktu respons. Waktu respons biasanya miring kanan dan kira-kira didistribusikan seperti Ex-Gaussian atau Weibull.
beginneR

Saya akan mengerjakan contoh seperti itu, tetapi itu akan menjadi kesalahan yang miring, distribusi marjinal Y adalah insidental. Juga, data waktu respons harus condong ke kanan (beberapa RT yang panjang, tetapi kuat), tidak miring ke kiri (menuju nilai kecil).
gung - Reinstate Monica

Ya miring kanan, saya tidak sengaja menulis "miring kiri" di pertanyaan saya.
beginneR

1
terima kasih atas jawaban Anda yang luas. Sebenarnya, saya mensimulasikan data untuk model multilevel. Saya hanya menggunakan kode dan mengadopsinya untuk skenario regresi linier sederhana.
beginneR

satu pertanyaan lagi: apakah Anda tahu bagaimana mensimulasikan data pengukuran berulang menggunakan model regresi seperti di atas sehingga tindakan berulang memiliki struktur korelasi spesifik (untuk memperhitungkan kebulatan)? Katakanlah ada N subjek yang masing-masing memberikan 20 percobaan di masing-masing dari tiga kondisi perawatan di mana korelasi antara kondisi perawatan harus diketahui dalam proses menghasilkan data.
beginneR
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.