Копула и моделирование двоичных и непрерывных переменных

Я пытаюсь смоделировать переменные, зная их предельное распределение и их корреляционную матрицу. Я знаю, что мы можем использовать такие пакеты, как копула, но я не знаком с тем, как это сделать. Может ли кто-нибудь помочь

#mean(w1)=0.6, sd(w1)=0.38; w1 is normally distributed
#mean(w2)=0.31; w2 is binary
#mean(w3)=0.226; w3 is binary

cor
           w1         w2         w3
w1  1.0000000 -0.3555066 -0.1986376
w2 -0.3555066  1.0000000  0.1030849
w3 -0.1986376  0.1030849  1.0000000

person SimRock    schedule 06.12.2017    source источник


Ответы (1)


На основе ответа здесь: https://stackoverflow.com/a/10540234/6455166

library(copula)
set.seed(123)
myCop <- normalCopula(param = c(-0.46, -0.27, 0.18), 
                      dim = 3, dispstr = "un")
out <- rCopula(1e5, myCop)
out[, 1] <- qnorm(out[, 1], mean = 0.6, sd = 0.38)
out[, 2] <- qbinom(out[, 2], size = 1, prob = 0.31)
out[, 3] <- qbinom(out[, 3], size = 1, prob = 0.226)

cor(out)
#            [,1]       [,2]       [,3]
# [1,]  1.0000000 -0.3548863 -0.1943631
# [2,] -0.3548863  1.0000000  0.1037638
# [3,] -0.1943631  0.1037638  1.0000000
colMeans(out)
# [1] 0.5992595 0.3118300 0.2256000
sd(out[, 1])
# [1] 0.3806173

Объяснение. Мы рисуем коррелированные юниформы, а затем конвертируем каждый вектор юниформ в желаемое распределение. Значения аргумента param в normalCopula были получены путем проб и ошибок: начните с желаемых корреляций (например, c(-0.3555, -0.1986, 0.103)), затем корректируйте их, пока cor(out) не даст нужные корреляции.

person Weihuang Wong    schedule 07.12.2017
comment
Спасибо @WeihuangWong. Я не уверен, как имитировать получение распределения Бернули из вывода qbinom, а также нормальное распределение из qnorm. У вас есть пример, я мог бы использовать. Спасибо - person SimRock; 09.12.2017
comment
Мы моделируем равномерное распределение (это то, что делает rCopula), а затем конвертируем однородные случайные величины в бернуллиевские и нормальные (это то, что делают qbinom и qnorm). Это двухэтапный процесс. Я не уверен, какой дополнительный пример вы имеете в виду, помимо того, что уже есть в приведенном выше коде. - person Weihuang Wong; 10.12.2017
comment
Большое спасибо @WeihuangWong. Я понял это позже, когда проверил файл qbinom. Извините за путаницу и спасибо за своевременный ответ - person SimRock; 11.12.2017