Hasilkan data berkorelasi acak antara variabel biner dan kontinu

23

Saya ingin menghasilkan dua variabel. Salah satunya adalah variabel hasil biner (katakanlah keberhasilan / kegagalan) dan yang lainnya adalah usia dalam tahun. Saya ingin usia berkorelasi positif dengan kesuksesan. Misalnya harus ada lebih banyak keberhasilan di segmen usia yang lebih tinggi daripada di bawah. Idealnya saya harus dalam posisi untuk mengontrol tingkat korelasi. Bagaimana aku melakukan itu?

Terima kasih

pengguna333
sumber

Jawaban:

20

Pendekatan @cram pasti akan berhasil. Dalam hal sifat ketergantungan itu agak membatasi sekalipun.

Metode lain adalah dengan menggunakan kopula untuk memperoleh distribusi bersama. Anda dapat menentukan distribusi marjinal untuk kesuksesan dan usia (jika Anda memiliki data yang ada ini sangat sederhana) dan keluarga kopula. Memvariasikan parameter kopula akan menghasilkan tingkat ketergantungan yang berbeda, dan berbagai keluarga kopula akan memberi Anda berbagai hubungan ketergantungan (mis. Ketergantungan ekor yang kuat).

Tinjauan umum melakukan ini di R melalui paket kopula tersedia di sini . Lihat juga diskusi dalam makalah itu untuk paket tambahan.

Namun Anda tidak perlu seluruh paket; inilah contoh sederhana menggunakan Gaussian copula, probabilitas keberhasilan marjinal 0,6, dan usia yang didistribusikan gamma. Bervariasi untuk mengontrol ketergantungan.

r = 0.8 # correlation coefficient
sigma = matrix(c(1,r,r,1), ncol=2)
s = chol(sigma)
n = 10000
z = s%*%matrix(rnorm(n*2), nrow=2)
u = pnorm(z)

age = qgamma(u[1,], 15, 0.5)
age_bracket = cut(age, breaks = seq(0,max(age), by=5))
success = u[2,]>0.4

round(prop.table(table(age_bracket, success)),2)

plot(density(age[!success]), main="Age by Success", xlab="age")
lines(density(age[success]), lty=2)
legend('topright', c("Failure", "Success"), lty=c(1,2))

Keluaran:

Meja:

           success
age_bracket FALSE TRUE
    (0,5]    0.00 0.00
    (5,10]   0.00 0.00
    (10,15]  0.03 0.00
    (15,20]  0.07 0.03
    (20,25]  0.10 0.09
    (25,30]  0.07 0.13
    (30,35]  0.04 0.14
    (35,40]  0.02 0.11
    (40,45]  0.01 0.07
    (45,50]  0.00 0.04
    (50,55]  0.00 0.02
    (55,60]  0.00 0.01
    (60,65]  0.00 0.00
    (65,70]  0.00 0.00
    (70,75]  0.00 0.00
    (75,80]  0.00 0.00

masukkan deskripsi gambar di sini

JMS
sumber
Jawaban bagus! Copulas adalah alat yang indah jika kurang dihargai. Model probit (dengan Gaussian marginal pada variabel kontinu) adalah kasus khusus dari model Gaussian copula. Tetapi ini adalah solusi yang jauh lebih umum.
jpillow
1
@ JMS: +1 Ya, Copulas sangat menarik. Saya harus mencoba mempelajarinya lebih detail!
ocram
@ jpillow Memang; Model causa Gaussian menggunakan model tipe-probit multivarian dalam bentuk apa pun. Melalui pencampuran skala, mereka juga memperluas model kopula dan logit / robit juga. Tres cool :)
JMS
@ocram Lakukan! Ada banyak pertanyaan terbuka dalam konteks data campuran (ketika menggunakan mereka sebagai model dan bukan hanya menggambar dari mereka) yang orang-orang seperti saya akan senang melihat dipecahkan ...
JMS
@ SMJ Jawaban yang sangat bagus!
user333
28

Anda dapat mensimulasikan model regresi logistik .

Lebih tepatnya, Anda pertama-tama dapat menghasilkan nilai untuk variabel usia (misalnya menggunakan distribusi yang seragam) dan kemudian menghitung probabilitas keberhasilan menggunakan

π(x)=exp(β0+β1x)1+exp(β0+β1x)

β0β1β1

π

Contoh ilustrasi dalam R:

n <- 10
beta0 <- -1.6
beta1 <- 0.03
x <- runif(n=n, min=18, max=60)
pi_x <- exp(beta0 + beta1 * x) / (1 + exp(beta0 + beta1 * x))
y <- rbinom(n=length(x), size=1, prob=pi_x)
data <- data.frame(x, pi_x, y)
names(data) <- c("age", "pi", "y")
print(data)

         age        pi y
 1  44.99389 0.4377784 1
 2  38.06071 0.3874180 0
 3  48.84682 0.4664019 1
 4  24.60762 0.2969694 0
 5  39.21008 0.3956323 1
 6  24.89943 0.2988003 0
 7  51.21295 0.4841025 1
 8  43.63633 0.4277811 0
 9  33.05582 0.3524413 0
 10 30.20088 0.3331497 1
okram
sumber
3
Jawaban yang bagus, meskipun dari sudut pandang estetika ( bukan yang praktis) model regresi probit mungkin bahkan lebih baik. Model probit setara dengan memulai dengan RV Gaussian bivariat dan menetapkan salah satunya (menjadi nol atau 1). Benar-benar hanya melibatkan penggantian fungsi normal kumulatif Gaussian ("probit") untuk logit yang digunakan dalam regresi logistik. Secara praktis ini harus memberikan kinerja yang sama (dan secara komputasional lebih lambat karena normcdf mahal untuk dievaluasi (1 + e ^ x) ^ - 1), tetapi senang memikirkan seorang Gaussian dengan salah satu variabel yang disensor ("dibulatkan").
jpillow
@ jpillow: Terima kasih atas komentar Anda. Saya akan memikirkannya segera!
ocram
1
Apa yang baik tentang model kopula probit / Gaussian adalah bahwa parameter mengambil bentuk matriks kovarians antara dua kuantitas (salah satunya kemudian di-binarisasi menjadi 0 dan 1). Jadi itu bagus dari sudut pandang interpretabilitas (tapi tidak begitu baik dari sudut pandang kenyamanan komputasi).
jpillow
1

XYX . Itu akan memberi Anda korelasi.

Untuk menghitung korelasinya, cara paling sederhana adalah dengan menggeser Y sesuai dengan nilai X. Jumlah yang Anda gunakan akan menjadi ukuran korelasi.

Alex Monras
sumber