Generar datos correlacionados al azar entre una variable binaria y una variable continua.

23

Quiero generar dos variables. Una es la variable de resultado binaria (digamos éxito / fracaso) y la otra es la edad en años. Quiero que la edad se correlacione positivamente con el éxito. Por ejemplo, debería haber más éxitos en los segmentos de mayor edad que en los menores. Idealmente, debería estar en condiciones de controlar el grado de correlación. ¿Cómo puedo hacer eso?

Gracias

usuario333
fuente

Respuestas:

20

El enfoque de @ ocram ciertamente funcionará. Sin embargo, en términos de las propiedades de dependencia es algo restrictivo.

Otro método es usar una cópula para derivar una distribución conjunta. Puede especificar distribuciones marginales para el éxito y la edad (si tiene datos existentes, esto es especialmente simple) y una familia de cópulas. Variar los parámetros de la cópula producirá diferentes grados de dependencia, y las diferentes familias de cópula le darán varias relaciones de dependencia (por ejemplo, una fuerte dependencia de la cola superior).

Una descripción general reciente de cómo hacer esto en R a través del paquete de cópula está disponible aquí . Vea también la discusión en ese documento para paquetes adicionales.

Sin embargo, no necesariamente necesita un paquete completo; Aquí hay un ejemplo simple usando una cópula gaussiana, probabilidad de éxito marginal 0.6 y edades distribuidas gamma. Varíe r para controlar la dependencia.

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

Salida:

Mesa:

           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

ingrese la descripción de la imagen aquí

JMS
fuente
¡Gran respuesta! Las cópulas son una herramienta hermosa aunque poco apreciada. El modelo probit (con marginal gaussiano en la variable continua) es un caso especial del modelo de cópula gaussiana. Pero esta es una solución mucho más general.
jpillow
1
@JMS: +1 Sí, las cópulas son muy atractivas. ¡Debería tratar de estudiarlos con más detalles!
ocram
@jpillow De hecho; Los modelos de cópula gaussiana subsumen modelos de tipo probit multivariados de cualquier tipo. A través de la mezcla a escala también se extienden a t / cópulas logísticas y modelos logit / robit. Tres cool :)
JMS
@ocram Do! Hay muchas preguntas abiertas en contextos de datos mixtos (cuando se utiliza como modelos y no sólo el dibujo de ellos) que la gente como yo le encantaría ver resuelto ...
JMS
@JMS Excelente respuesta!
user333
28

Puede simular el modelo de regresión logística .

Más precisamente, primero puede generar valores para la variable de edad (por ejemplo, utilizando una distribución uniforme) y luego calcular las probabilidades de éxito utilizando

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

β0 0β1β1

π

Ejemplo ilustrativo en 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
ocram
fuente
3
Buena respuesta, aunque desde un punto de vista estético ( no práctico) un modelo de regresión probit podría ser aún mejor. El modelo probit es equivalente a comenzar con un RV gaussiano bivariado y poner en umbral uno de ellos (a cero o 1). Realmente solo implica sustituir la función normal acumulativa gaussiana ("probit") por el logit utilizado en la regresión logística. Prácticamente esto debería dar el mismo rendimiento (y computacionalmente es más lento ya que normcdf es costoso de evaluar (1 + e ^ x) ^ - 1), pero es bueno pensar en un gaussiano con una de las variables censuradas ("redondeada").
jpillow
@jpillow: Gracias por tu comentario. ¡Lo pensaré lo antes posible!
ocram
1
Lo bueno del modelo de cópula probit / gaussiana es que los parámetros toman la forma de una matriz de covarianza entre las dos cantidades (una de las cuales se binariza en 0 y 1). Por lo tanto, es agradable desde el punto de vista de la interpretabilidad (pero no tan agradable desde el punto de vista de la conveniencia computacional).
jpillow
1

XYX

YX

Alex Monras
fuente