您好我想一次为60个变量生成相关二进制数据(0/1)。
我尝试了一些像public class Patron
{
public int patron { get; set; }
public int book_id { get; set; }
public IEnumerable<Book> books { get; set; }
}
和bindata
这样的软件包,但我主要得到一个错误,告诉我我给出的随机相关矩阵是不正确的。 (我试图从截断的正态分布中创建它......)
我唯一想要的是指定我的变量之间的平均相关性,如0.7,并且也有一些负相关。那可能吗?感谢
编辑:我的剧本
mvrnorm
答案 0 :(得分: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。基本上,你需要使用高斯copula。对于伯努利案例,它是每对变量的相对简单的代数。我猜你上面提到的包裹也适合你。
[编辑]对于伯努利向量,并非所有相关矩阵都是可接受的。考虑简单的三变量情况,其中边际概率为0.5。做简单代数,得到(X_i,X_j)的相关性为4E [X_i X_j] -1。它们在每对的[-1,1]范围内。假设您希望所有i的(X_i,X_j)的相关性为-0.5,j不相等。这要求所有i的E [X_i X_j] = 1/8,j不相等。如果您尝试绘制样本空间的三个子集的维恩图,其中每个子集覆盖样本空间的一半,并且每对只有1/8的样本空间重叠,您可以很容易地看到这在逻辑上是不可能的。 / p>
所以,最重要的是你需要为函数提供逻辑上可行的二进制相关矩阵。它不能是任何有效的相关矩阵。如果您不关心特定的相关系数,只需使用高斯copula与任何有效的相关矩阵。对于您感兴趣的包,您可以通过
进行rmvbin(1000,margprob=rep(0.5,5),sigma=corr_mat)