バイナリ変数と連続変数間のランダム相関データを生成します


23

2つの変数を生成します。1つはバイナリの結果変数(成功/失敗など)で、もう1つは年数です。年齢と成功との間に正の相関関係が必要です。たとえば、年齢の低いセグメントよりも年齢の高いセグメントの方が成功するはずです。理想的には、相関の程度を制御できる立場にいる必要があります。それ、どうやったら出来るの?

ありがとう

回答:


20

@ocramのアプローチは確かに機能します。ただし、依存関係のプロパティに関しては、多少制限があります。

別の方法は、コピュラを使用して共同分布を導出することです。成功と年齢(既存のデータがある場合、これは特に簡単です)およびコピュラファミリの周辺分布を指定できます。コピュラのパラメーターを変更すると、異なる程度の依存関係が得られ、異なるコピュラファミリにより、さまざまな依存関係が得られます(強力な上部テール依存関係など)。

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

ここに画像の説明を入力してください


素晴らしい答えです!コピュラは、評価が低ければ美しいツールです。プロビットモデル(連続変数にガウスマージナルがある)は、ガウスコピュラモデルの特殊なケースです。しかし、これははるかに一般的なソリューションです。
jpillow

1
@JMS:+1はい、コピュラは非常に魅力的です。もっと詳しく調べてみるべきです!
ocram

@jpillow Indeed; ガウスコピュラモデルは、あらゆる種類の多変量プロビット型モデルを想定しています。スケールミキシングにより、t / logistic copulaeおよびlogit / robitモデルにも拡張されます。トレスクール:)
JMS

@ocram Do!(モデルとしてそれらを使用して、ちょうど彼らから描くないとき)混合データコンテキストで開いて多くの質問は...私のような人々が解決見てみたいことがあります
JMS

@JMSすばらしい答えです!
-user333

28

ロジスティック回帰モデルをシミュレートできます。

より正確には、最初に年齢変数の値を生成し(たとえば均一な分布を使用)、次に成功の確率を計算します

πバツ=expβ0+β1バツ1+expβ0+β1バツ

β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
ニースの答えは、かかわらず、美的観点(からではない実用的な1)プロビット回帰モデルにもよりよいかもしれません。プロビットモデルは、2変量ガウスRVで開始し、そのうちの1つを(ゼロまたは1に)しきい値処理することと同等です。実際には、ロジスティック回帰で使用されるロジットをガウス累積正規(「プロビット」)関数に置き換えるだけです。実際には、これにより同じパフォーマンスが得られるはずです(また、normcdfは(1 + e ^ x)^-1を評価するのに費用がかかるため、計算が遅くなります)が、変数の1つが打ち切られた(「丸められた」)ガウスについて考えるのは良いことです。
jpillow

@jpillow:コメントありがとうございます。できるだけ早く考えます!
ocram

1
プロビット/ガウスコピュラモデルの良い点は、パラメーターが2つの量の間の共分散行列の形式を取ることです(その1つは0と1に2値化されます)。そのため、解釈可能性の観点からは優れています(ただし、計算の利便性の観点からはそれほど優れていません)。
jpillow

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.