Genera dati correlati casuali tra una variabile binaria e una continua


23

Voglio generare due variabili. Uno è una variabile di risultato binario (dire successo / fallimento) e l'altro è l'età in anni. Voglio che l'età sia correlata positivamente con il successo. Ad esempio, dovrebbero esserci più successi nei segmenti di età superiore rispetto a quelli inferiori. Idealmente, dovrei essere in grado di controllare il grado di correlazione. Come lo faccio?

Grazie

Risposte:


20

L'approccio di @cram funzionerà sicuramente. In termini di proprietà di dipendenza è comunque un po 'restrittivo.

Un altro metodo consiste nell'utilizzare una copula per derivare una distribuzione congiunta. Puoi specificare distribuzioni marginali per successo ed età (se disponi di dati esistenti, questo è particolarmente semplice) e una famiglia di copule. Variando i parametri della copula si ottengono diversi gradi di dipendenza, e diverse famiglie di copula ti daranno varie relazioni di dipendenza (ad es. Forte dipendenza della coda superiore).

Una panoramica recente di ciò in R tramite il pacchetto copula è disponibile qui . Vedi anche la discussione in quel documento per ulteriori pacchetti.

Tuttavia, non è necessario necessariamente un intero pacchetto; ecco un semplice esempio usando una copula gaussiana, probabilità di successo marginale 0,6 ed età distribuite gamma. Varia r per controllare la dipendenza.

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

Produzione:

Tavolo:

           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

inserisci qui la descrizione dell'immagine


Bella risposta! Le copule sono uno strumento meraviglioso se sottovalutato. Il modello probit (con marginale gaussiano sulla variabile continua) è un caso speciale del modello di copula gaussiana. Ma questa è una soluzione molto più generale.
jpillow,

1
@JMS: +1 Sì, le Copule sono molto interessanti. Dovrei provare a studiarli in modo più dettagliato!
Ocram,

@jpillow Indeed; I modelli di copula gaussiana utilizzano modelli di tipo probit multivariato di qualsiasi tipo. Tramite la miscelazione su scala si estendono anche alle copule t / logistiche e ai modelli logit / robit. Tres cool :)
JMS,

@ocram Do! Ci sono molte domande aperte in contesti di dati misti (quando li usano come modelli e non solo traggendoli) che le persone come me vorrebbero vedere risolte ...
JMS,

@JMS Ottima risposta!
user333,

28

È possibile simulare il modello di regressione logistica .

Più precisamente, puoi prima generare valori per la variabile age (ad esempio usando una distribuzione uniforme) e quindi calcolare le probabilità di successo usando

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

β0β1β1

π

Esempio illustrativo in 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

3
Bella risposta, anche se dal punto di vista estetico ( non pratico) un modello di regressione probit potrebbe essere ancora più bello. Il modello probit equivale a partire con un camper gaussiano bivariato e a sottrarne uno (a zero o 1). In realtà implica solo la sostituzione della funzione cumulativa normale ("probit") gaussiana per il logit usato nella regressione logistica. Praticamente questo dovrebbe dare le stesse prestazioni (e computazionalmente è più lento poiché normcdf è costoso da valutare (1 + e ^ x) ^ - 1), ma è bello pensare a un gaussiano con una delle variabili censurate ("arrotondato").
jpillow,

@jpillow: grazie per il tuo commento. Ci penserò al più presto!
Ocram,

1
La cosa bella del modello di copula probit / gaussiana è che i parametri assumono la forma di una matrice di covarianza tra le due quantità (una delle quali viene quindi binarizzata in 0 e 1). Quindi è bello dal punto di vista dell'interpretazione (ma non così bello dal punto di vista della convenienza computazionale).
jpillow,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.