Generieren Sie zufällig korrelierte Daten zwischen einer binären und einer kontinuierlichen Variablen


23

Ich möchte zwei Variablen erzeugen. Eines ist die binäre Ergebnisvariable (sagen wir Erfolg / Misserfolg) und das andere ist das Alter in Jahren. Ich möchte, dass das Alter positiv mit dem Erfolg korreliert. Zum Beispiel sollte es mehr Erfolge in den höheren Alterssegmenten geben als in den niedrigeren. Idealerweise sollte ich in der Lage sein, den Grad der Korrelation zu kontrollieren. Wie mache ich das?

Vielen Dank

Antworten:


20

@ocram Ansatz wird sicherlich funktionieren. In Bezug auf die Abhängigkeitseigenschaften ist es jedoch etwas restriktiv.

Eine andere Methode besteht darin, eine Kopula zu verwenden, um eine gemeinsame Verteilung abzuleiten. Sie können Randverteilungen für den Erfolg und das Alter (wenn Sie über Daten verfügen, ist dies besonders einfach) und eine Copula-Familie angeben. Wenn Sie die Parameter der Copula variieren, ergeben sich unterschiedliche Abhängigkeiten, und verschiedene Copulafamilien ergeben verschiedene Abhängigkeitsbeziehungen (z. B. starke Abhängigkeit vom oberen Schwanz).

Eine aktuelle Übersicht dazu in R über das Copula-Paket finden Sie hier . Weitere Informationen zu Paketen finden Sie auch in der Diskussion in diesem Dokument.

Sie brauchen jedoch nicht unbedingt ein ganzes Paket. Hier ist ein einfaches Beispiel mit einer Gaußschen Kopula, einer Grenzerfolgswahrscheinlichkeit von 0,6 und einem gammaverteilten Alter. Variiere r, um die Abhängigkeit zu kontrollieren.

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

Ausgabe:

Tabelle:

           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

Bildbeschreibung hier eingeben


Gute Antwort! Copulas sind ein schönes, wenn auch wenig geschätztes Werkzeug. Das Probit-Modell (mit dem Gaußschen Rand auf der stetigen Variablen) ist ein Sonderfall des Gaußschen Copula-Modells. Dies ist jedoch eine viel allgemeinere Lösung.
Jpillow

1
@JMS: +1 Ja, Copulas sind sehr ansprechend. Ich sollte versuchen, sie genauer zu studieren!
Ocram

@ jpillow In der Tat; Gaußsche Copula-Modelle subsumieren multivariate Probit-Modelle jeglicher Art. Über das Scale Mixing erstrecken sie sich auch auf t / logistische Copulae und logit / robit Modelle. Sehr cool :)
JMS

@ocram Do! Es gibt viele offene Fragen in gemischten Datenkontexten (wenn man sie als Modelle verwendet und nicht nur aus ihnen zeichnet), die Leute wie ich gerne gelöst sehen würden ...
JMS

@ JMS Ausgezeichnete Antwort!
User333

28

Sie können das logistische Regressionsmodell simulieren .

Genauer gesagt, Sie können zunächst Werte für die Altersvariable generieren (z. B. mit einer Gleichverteilung) und dann mit Erfolgswahrscheinlichkeiten berechnen

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

β0β1β1

π

Illustratives Beispiel 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
Gute Antwort, obwohl aus ästhetischer Sicht ( keine praktische) ein Probit-Regressionsmodell möglicherweise noch besser ist. Das Probit-Modell ist gleichbedeutend damit, mit einem bivariaten Gaußschen RV zu beginnen und einen dieser Werte festzulegen (auf Null oder 1). Im Grunde geht es nur darum, die in der logistischen Regression verwendete Logit durch die Gaußsche kumulative Normalfunktion ("Probit" -Funktion) zu ersetzen. Praktisch sollte dies die gleiche Leistung bringen (und rechnerisch ist es langsamer, da die Auswertung von normcdf teuer ist (1 + e ^ x) ^ - 1), aber es ist schön, über einen Gaußschen mit einer der zensierten Variablen ("gerundet") nachzudenken.
Jpillow

@jpillow: Danke für deinen Kommentar. Ich werde so schnell wie möglich darüber nachdenken!
Ocram

1
Das Schöne am Probit / Gaußschen Kopula-Modell ist, dass die Parameter die Form einer Kovarianzmatrix zwischen den beiden Größen haben (von denen eine dann in 0 und 1 binarisiert wird). Vom Standpunkt der Interpretierbarkeit ist es also schön (aber vom Standpunkt der Rechenfreundlichkeit nicht so schön).
Jpillow

1

Sie können zuerst die Erfolgs- / Fehlervariable generieren (X) und generieren dann das Alter (Y.) mit einer unterschiedlichen Verteilung in Abhängigkeit vom Wert von X. Das gibt Ihnen Korrelation.

Um die Korrelation zu quantifizieren, ist es am einfachsten, sie zu verschieben Y. nach dem Wert von X. Der Betrag, um den Sie verschieben, ist ein Maß für die Korrelation.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.