Генерация случайных коррелированных данных между двоичной и непрерывной переменной

23

Я хочу создать две переменные. Один из них - двоичная переменная результата (скажем, успех / неудача), а другой - возраст в годах. Я хочу, чтобы возраст был положительно связан с успехом. Например, должно быть больше успехов в более высоких возрастных сегментах, чем в более низких. В идеале я должен быть в состоянии контролировать степень корреляции. Как я могу это сделать?

Благодарность

user333
источник

Ответы:

20

Подход @ ocram, безусловно, будет работать. Однако с точки зрения свойств зависимости это несколько ограничительно.

Другой метод заключается в использовании связки для получения совместного распределения. Вы можете указать предельные распределения для успеха и возраста (если у вас есть существующие данные, это особенно просто) и семейства связок. Варьирование параметров связки приведет к разной степени зависимости, а разные семейства связок дадут вам различные зависимости (например, сильная зависимость от верхнего хвоста).

Недавний обзор этого в R через пакет copula доступен здесь . Смотрите также обсуждение в этом документе для дополнительных пакетов.

Вам не обязательно нужен целый пакет; Вот простой пример использования гауссовой связки, предельной вероятности успеха 0,6 и гамма-распределенных возрастов. Варьируйте г, чтобы контролировать зависимость.

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

введите описание изображения здесь

JMS
источник
Отличный ответ! Копулы - прекрасный, но недооцененный инструмент. Пробит-модель (с гауссовым маргиналом на непрерывной переменной) является частным случаем модели гауссовой связки. Но это гораздо более общее решение.
jpillow
1
@JMS: +1 Да, Копулы очень привлекательны. Я должен попытаться изучить их более подробно!
Октябрь
@jpillow Действительно; Модели гауссовых связок включают многовариантные модели пробитного типа любого рода. Посредством смешивания масштабов они также распространяются на т / логистические связки и модели логит / робит. Трес круто :)
JMS
@окрам ли! Есть много открытых вопросов в смешанных контекстах данных (при использовании их в качестве моделей, а не просто на их основе), которые такие люди, как я, хотели бы видеть решенными ...
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
ocram
источник
3
Хороший ответ, хотя с эстетической точки зрения (а не с практической точки зрения ) модель пробит-регрессии может быть даже лучше. Пробит-модель эквивалентна началу с двумерным гауссовым RV и порогу одного из них (нулю или 1). На самом деле это просто замена гауссовой кумулятивной нормальной («пробитовой») функции на логит, используемый в логистической регрессии. Практически это должно дать ту же производительность (и в вычислительном отношении она медленнее, поскольку normcdf стоит дорого оценивать (1 + e ^ x) ^ - 1), но хорошо бы подумать о гауссовском с одной из цензурированных переменных («округленных»).
jpillow
@jpillow: Спасибо за ваш комментарий. Я подумаю об этом как можно скорее!
Октябрь
1
Что хорошо в модели пробита / гауссовой связки, так это то, что параметры принимают форму ковариационной матрицы между двумя величинами (одна из которых затем преобразуется в 0 и 1). Так что это хорошо с точки зрения интерпретируемости (но не так хорошо с точки зрения удобства вычислений).
jpillow
1

XYX

YX . Сумма, на которую вы меняете, будет мерой корреляции.

Алекс Монрас
источник