이진 변수와 연속 변수간에 임의의 상관 데이터 생성


23

두 개의 변수를 생성하고 싶습니다. 하나는 이진 결과 변수 (성공 / 실패)이고 다른 하나는 나이 (년)입니다. 나는 나이가 성공과 긍정적으로 상관되기를 원합니다. 예를 들어, 연령대가 높을수록 나이가 적을수록 성공이 더 높아야합니다. 이상적으로 상관 정도를 제어 할 수있는 위치에 있어야합니다. 어떻게합니까?

감사

답변:


20

@ocram의 접근 방식은 확실히 작동합니다. 의존성 속성의 관점에서는 다소 제한적입니다.

다른 방법은 copula를 사용하여 관절 분포를 유도하는 것입니다. 성공 및 연령 (기존 데이터가있는 경우 특히 단순함) 및 copula 제품군에 대한 한계 분포를 지정할 수 있습니다. copula의 매개 변수를 변경하면 의존도가 달라지고 다른 copula 제품군은 다양한 의존 관계를 제공합니다 (예 : 강한 상단 꼬리 의존성).

copula 패키지를 통해 R에서이 작업을 수행하는 최근 개요는 여기에서 확인할 수 있습니다 . 추가 패키지에 대해서는이 백서의 설명을 참조하십시오.

그러나 반드시 전체 패키지가 필요하지는 않습니다. 다음은 가우스 copula, 한계 성공 확률 0.6 및 감마 분산 연령을 사용하는 간단한 예입니다. 의존성을 제어하려면 r을 바꿉니다.

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

산출:

표:

           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

여기에 이미지 설명을 입력하십시오


좋은 답변입니다! Copulas는 평가가 부족한 도구라면 아름답습니다. 프로 빗 모델 (연속 변수에 가우시안 한계가있는)은 가우시안 copula 모델의 특별한 경우입니다. 그러나 이것은 훨씬 일반적인 솔루션입니다.
jpillow

1
@JMS : +1 예, Copulas는 매우 매력적입니다. 좀 더 자세하게 연구하려고 노력해야합니다!
ocram

@jpillow 실제로; 가우시안 copula 모델은 모든 종류의 다변량 프로 빗형 모델을 가정합니다. 스케일 믹싱을 통해 t / logistic copulae 및 logit / robit 모델까지 확장됩니다. Tres cool :)
JMS

@ocram Do! 나와 같은 사람들이 해결하기를 원할 것이라는 혼합 된 데이터 컨텍스트 (모델을 사용하고 모델을 사용하는 것이 아니라)에 대해 많은 열린 질문이 있습니다.
JMS

@JMS 우수 답변!
user333

28

로지스틱 회귀 모델을 시뮬레이션 할 수 있습니다 .

보다 정확하게는 먼저 연령 변수에 대한 값을 생성하고 (예 : 균일 분포를 사용하여) 성공 확률을 계산할 수 있습니다

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

β0β1β1

π

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
미묘한 관점에서 ( 실용적이지 않은 ) 프로 빗 회귀 모델이 더 좋을 수도 있지만 좋은 대답 입니다. 프로 비트 모델은 이변 량 가우스 RV로 시작하여 그 중 하나를 임계 값 (0 또는 1)으로 설정하는 것과 같습니다. 실제로 로지스틱 회귀 분석에 사용되는 로짓에 대해 가우스 누적 정규 ( "probit") 함수를 대체하는 것만 포함됩니다. 실제로 이것은 동일한 성능을 제공해야합니다 (그리고 normcdf는 평가하기에 비용이 많이 들기 때문에 계산 속도가 느리지 만 (1 + e ^ x) ^-1), 변수 중 하나가 검열 된 ( "반올림") 가우시안에 대해 생각하는 것이 좋습니다.
jpillow

@ jpillow : 귀하의 의견에 감사드립니다. 최대한 빨리 생각하겠습니다!
ocram

1
probit / Gaussian copula 모델의 좋은 점은 매개 변수가 두 수량 사이의 공분산 행렬 형태를 취한다는 것입니다 (그중 하나는 0과 1로 이진화 됨). 따라서 해석 성의 관점에서 좋지만 (계산 편의의 관점에서는 그렇게 좋지는 않습니다).
jpillow

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.