Я хочу создать биномиальный вектор на основе ряда коррелированных элементов, каждый из которых имеет определенную вероятность. Когда я использую эл. г. rbinom(1e3, size = 4, prob = c(p.x1, p.x2, p.x3, p.x4))
Я получаю что-то вроде 3 3 0 0 2 4 1 0 4 4 0 1 4...
. Теперь эти x_i имеют определенные вероятности, но не коррелированы.
Пять лет назад Джош О'Брайен предложил отличный подход к генерации коррелированных биномиальных данных. Я думаю, что это близко к моим потребностям, но оно предназначено для пар, и я хочу 1., один вектор и 2., больше переменных p. Я уже пытался изменить функцию, чтобы создать большее количество переменных, но пока безуспешно, и я часто сталкиваюсь с
Error in commonprob2sigma(commonprob, simulvals) :
Matrix commonprob not admissible.
который отправляется импортированным пакетом bindata
.
Моя идея состоит в том, чтобы определить в функции Джоша четыре (или лучше произвольное число) вероятностей и рос, что-то вроде
rmvBinomial3 <- function(n, size, p1, p2, p3, p4, rho) {
X <- replicate(n, {
colSums(rmvbin(size, c(p1,p2,p3,p4), bincorr=(1-rho)*diag(4)+rho))
})
t(X)
}
Конечно, требуется больше rhos, и я думаю, что матрица вероятностей должна быть каким-то образом включена, как это можно сделать с помощью пакета bindata
. Я не знаю, как его включить.
rho1 <- -0.89; rho2 <- -0.75; rho3 <- -0.62; rho4 <- -0.59
m <- matrix(c(1, rho1, rho2, rho3,
rho1, 1, rho4, rho2,
rho2, rho4, 1, rho1,
rho3, rho2, rho1, 1), ncol = 4)
# [,1] [,2] [,3] [,4]
# [1,] 1.00 -0.89 -0.75 -0.62
# [2,] -0.89 1.00 -0.59 -0.75
# [3,] -0.75 -0.59 1.00 -0.89
# [4,] -0.62 -0.75 -0.89 1.00
К сожалению, каждая матрица, чтобы соответствовать условиям для bindata
, которую я проверяю с помощью bindata::check.commonprob(m)
, выдает ту же ошибку, что и выше. Я также не смог получить матрицу, созданную bindata::commonprob2sigma()
.
Другим недостатком для меня является диапазон Джоша rmvBinomial()
, похоже, он работает только между значениями для p.X_i= 0,2- -0,8 что-то, и мне нужны меньшие значения, например 0,01--0,1 тоже.
Любая помощь очень ценится.
Правка: Чтобы уточнить, ожидаемый результат действительно представляет собой всего один единственный вектор 3 3 0 0 2 4 1 0 4 4 0 1 4...
, как показано в начале, но элементы, из которых он получен, должны быть коррелированы в определенной степени ( т.е. один из элементов может вообще не иметь корреляции).