Gere dados aleatórios correlacionados entre uma variável binária e uma variável contínua

23

Eu quero gerar duas variáveis. Um é variável de resultado binário (digamos sucesso / fracasso) e o outro é a idade em anos. Quero que a idade seja positivamente correlacionada com o sucesso. Por exemplo, deve haver mais sucessos nos segmentos etários mais altos do que nos mais baixos. Idealmente, eu deveria estar em posição de controlar o grau de correlação. Como faço isso?

obrigado

user333
fonte

Respostas:

20

A abordagem do @ ocram certamente funcionará. Em termos das propriedades de dependência, é um pouco restritivo.

Outro método é usar uma cópula para derivar uma distribuição conjunta. Você pode especificar distribuições marginais para sucesso e idade (se você tiver dados existentes, isso é especialmente simples) e uma família de cópulas. A variação dos parâmetros da cópula produzirá diferentes graus de dependência, e diferentes famílias de cópulas fornecerão vários relacionamentos de dependência (por exemplo, forte dependência da cauda superior).

Uma visão geral recente de como fazer isso em R através do pacote copula está disponível aqui . Veja também a discussão nesse documento para pacotes adicionais.

Você não precisa necessariamente de um pacote inteiro; aqui está um exemplo simples usando uma cópula gaussiana, probabilidade marginal de sucesso 0,6 e idades distribuídas gama. Varie r para controlar a dependência.

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

Saída:

Tabela:

           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

insira a descrição da imagem aqui

JMS
fonte
Ótima resposta! Cópulas são uma ferramenta bonita, embora subestimada. O modelo probit (com marginal gaussiano na variável contínua) é um caso especial do modelo cópula gaussiano. Mas esta é uma solução muito mais geral.
jpillow
1
@JMS: +1 Sim, Copulas são muito atraentes. Eu deveria tentar estudá-los com mais detalhes!
Ocram
@jpillow De fato; Os modelos de cópula gaussiana substituem modelos multivariados do tipo probit de qualquer tipo. Por meio de mixagem em escala, eles também se estendem aos modelos t / logistic e modelos logit / robit. Tres cool :)
JMS
@ocram Do! Há uma série de questões abertas em contextos de dados mistos (quando usá-los como modelos e não apenas um desenho a partir deles) que pessoas como eu gostaria de ver resolvido ...
JMS
@JMS Excelente resposta!
user333
28

Você pode simular o modelo de regressão logística .

Mais precisamente, você pode primeiro gerar valores para a variável idade (por exemplo, usando uma distribuição uniforme) e depois calcular probabilidades de sucesso usando

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

β0 0β1β1

π

Exemplo ilustrativo em 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
fonte
3
Boa resposta, embora, do ponto de vista estético ( não prático), um modelo de regressão probit possa ser ainda melhor. O modelo probit é equivalente a começar com um VR gaussiano bivariado e limitar um deles (a zero ou 1). Realmente, isso envolve apenas substituir a função normal cumulativa gaussiana ("probit") pelo logit usado na regressão logística. Praticamente isso deve fornecer o mesmo desempenho (e computacionalmente é mais lento, pois o normcdf é caro para avaliar (1 + e ^ x) ^ - 1), mas é bom pensar em um gaussiano com uma das variáveis ​​censuradas ("arredondadas").
11132 jpillow
@ jpillow: Obrigado pelo seu comentário. Vou pensar nisso o mais rápido possível!
Ocram
1
O que é legal no modelo cópula probit / Gaussiano é que os parâmetros assumem a forma de uma matriz de covariância entre as duas grandezas (uma das quais é então binarizada em 0 e 1). Portanto, é bom do ponto de vista da interpretabilidade (mas não tão bom do ponto de vista da conveniência computacional).
jpillow
1

XYX

YX

Alex Monras
fonte