Générer des données corrélées aléatoires entre une variable binaire et une variable continue

23

Je veux générer deux variables. L'un est une variable de résultat binaire (disons succès / échec) et l'autre est l'âge en années. Je veux que l'âge soit en corrélation positive avec le succès. Par exemple, il devrait y avoir plus de succès dans les tranches d'âge supérieures que dans les tranches inférieures. Idéalement, je devrais être en mesure de contrôler le degré de corrélation. Comment je fais ça?

Merci

user333
la source

Réponses:

20

L'approche d'ocram fonctionnera certainement. En termes de propriétés de dépendance, c'est quelque peu restrictif.

Une autre méthode consiste à utiliser une copule pour dériver une distribution conjointe. Vous pouvez spécifier des distributions marginales pour le succès et l'âge (si vous avez des données existantes, c'est particulièrement simple) et une famille de copules. La variation des paramètres de la copule entraînera différents degrés de dépendance, et différentes familles de copules vous donneront diverses relations de dépendance (par exemple, une forte dépendance de la queue supérieure).

Un aperçu récent de cette opération dans R via le package copula est disponible ici . Voir également la discussion dans ce document pour des packages supplémentaires.

Cependant, vous n'avez pas nécessairement besoin d'un package complet; voici un exemple simple utilisant une copule gaussienne, une probabilité de réussite marginale de 0,6 et des âges distribués gamma. Variez r pour contrôler la dépendance.

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

Sortie:

Table:

           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

entrez la description de l'image ici

JMS
la source
Très bonne réponse! Les copules sont un bel outil bien que sous-estimé. Le modèle probit (avec un gaussien marginal sur la variable continue) est un cas particulier du modèle de la copule gaussienne. Mais c'est une solution beaucoup plus générale.
jpillow
1
@JMS: +1 Oui, les copules sont très attrayantes. Je devrais essayer de les étudier plus en détail!
ocram
@jpillow Effectivement; Les modèles de copules gaussiennes subsument des modèles multivariés de type probit de toute sorte. Grâce au mélange à l'échelle, ils s'étendent également aux copules t / logistiques et aux modèles logit / robit. Tres cool :)
JMS
@ocram Do! Il y a beaucoup de questions ouvertes dans des contextes de données mixtes (lorsque vous les utilisez comme modèles et pas seulement à partir de celles-ci) que des gens comme moi aimeraient voir résolus ...
JMS
@JMS Excellente réponse!
user333
28

Vous pouvez simuler le modèle de régression logistique .

Plus précisément, vous pouvez d'abord générer des valeurs pour la variable d'âge (par exemple en utilisant une distribution uniforme), puis calculer les probabilités de succès en utilisant

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

β0β1β1

π

Exemple illustratif dans 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
la source
3
Belle réponse, bien que d'un point de vue esthétique ( pas pratique) un modèle de régression probit pourrait être encore plus agréable. Le modèle probit équivaut à partir d'un RV gaussien bivarié et à seuiller l'un d'entre eux (à zéro ou 1). En réalité, cela implique simplement de substituer la fonction normale cumulative gaussienne ("probit") au logit utilisé dans la régression logistique. Pratiquement cela devrait donner les mêmes performances (et en calcul c'est plus lent car normcdf est cher à évaluer (1 + e ^ x) ^ - 1), mais c'est bien de penser à un gaussien avec une des variables censurée ("arrondie").
jpillow
@jpillow: Merci pour votre commentaire. J'y penserai dès que possible!
ocram
1
Ce qui est bien avec le modèle de copule probit / gaussienne, c'est que les paramètres prennent la forme d'une matrice de covariance entre les deux quantités (dont l'une est ensuite binarisée en 0 et 1). C'est donc agréable du point de vue de l'interprétabilité (mais pas si agréable du point de vue de la commodité du calcul).
jpillow
1

XOuiX

OuiX

Alex Monras
la source