2017-01-30 12 views
2

Привет Я хотел бы генерировать коррелированные двоичные данные (0/1) для 60 переменных за раз. Я пробовал некоторые пакеты, такие как bindata, и mvrnorm, но в основном получаю сообщение об ошибке, указывающее, что случайная матрица корреляции, которую я даю, неверна. (я пытался создать его из усеченного нормального распределения ...)моделирование коррелированных данных со спецификациями по ковариационной матрице

Единственное, что я хочу, это указать среднюю корреляцию между моими переменными, например 0,7, и также иметь некоторые отрицательные корреляции. Это возможно? Благодаря

EDIT: моего сценарий

set.seed(1) 
mymatrix <- matrix(rnorm(25, mean=0.7, sd=0.2), ncol=5) # random matrix mean 0.7 
mymatrix[lower.tri(mymatrix)] = t(mymatrix)[lower.tri(mymatrix)] # make it symmetric 
mymatrix[mymatrix>1]<-0.7 # make numbers between 0 and 1 
mymatrix[mymatrix<0]<-0.7 
library(bindata) 
res=rmvbin(1000, margprob=diag(mymatrix), bincorr = mymatrix) 
#### Error in commonprob2sigma(commonprob, simulvals) : 
#### Matrix commonprob not admissible. 
+1

Возможно, вы должны предоставить пример игрушки и обеспечить точный текст «ошибки, говоря мне, что случайная матрицу корреляции Даю это не так.» – lmo

+0

@lmo Спасибо, см. Редактирование .. – agenis

ответ

1

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

rmat <- matrix(rnorm(25),5,5) 
cov_mat <- rmat%*%t(rmat) 
corr_mat <- cov_mat/sqrt(diag(cov_mat)%*%t(diag(cov_mat))) 

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

[EDIT] Для векторов Бернулли допустимы не все корреляционные матрицы. Подумайте о простых трех переменных случаях, где предельные вероятности равны 0,5. Выполняя простую алгебру, вы получаете соотношение (X_i, X_j) как 4E [X_i X_j] -1. Они находятся в диапазоне [-1,1] для каждой пары. Предположим, что вы хотите, чтобы соотношение (X_i, X_j) было равным -0,5 для всех i, j не равно. Для этого требуется E [X_i X_j] = 1/8 для всех i, j не равно. Если вы попытаетесь нарисовать диаграмму Венна из трех подмножеств пространства образца, где каждое подмножество покрывает половину пространства выборки, и каждая пара перекрывается только на 1/8 пространства выборки, вы можете легко увидеть, что это логически невозможно.

Итак, в итоге вам нужно предоставить логически выполнимую двоичную корреляционную матрицу для функции. Это не может быть никакой действительной корреляционной матрицей. Если вам не нужны конкретные коэффициенты корреляции, просто используйте гауссовую связку с любой действительной корреляционной матрицей. Для вашего пакета интереса, вы можете сделать это

rmvbin(1000,margprob=rep(0.5,5),sigma=corr_mat) 
+0

спасибо за ответ, я понимаю ваш первый абзац, но статья, которую вы упомянули, действительно слишком сложна для моего математического знания .... Я попытался повторить мой код с вашим modif, но говорит : «Предупреждение: итоговая матрица ковариации не является положительно определенной». Все возвращаемые значения: NA. – agenis

+0

см. EDIT выше. – Julius

+0

Это правильно. Я отредактирую сообщение. Благодаря! – Julius