我编写了这个简单的函数,以便从受污染的二元正态分布中生成元组。它的作用是执行伯努利实验并基于结果,即1或0,来自两个分布之一的样本。
require(mvtnorm)
rcn <- function(n, covar1, sigma1, sigma2, eps, bias1, bias2, covar2){
sigma1 <- matrix( c(sigma1, covar1, covar1, sigma2), ncol = 2, nrow = 2, byrow = T) ;
sigma2 <- matrix( c(sigma1, covar2, covar2, sigma2), ncol = 2, nrow = 2, byrow = T)
m <- matrix(0, nrow = n, ncol = 2)
for(i in 1:n){
ind <- rbinom(1, 1, eps)
m[i,] <- (1 - ind)*rmvnorm(1, sigma = sigma1) + ind*rmvnorm(1, sigma = sigma2, mean = c(bias1, bias2) )
}
list(y1 = m[,1], y2 = m[,2] )
}
rcn(20, 0.9, 1, 1, 0.05, 0, 0, -0.9)
问题在于,当我这样做时,我得到一个我不太明白的警告,即
Warning message:
In matrix(c(sigma1, covar2, covar2, sigma2), ncol = 2, nrow = 2, :
data length [7] is not a sub-multiple or multiple of the number of rows [2]
你能告诉我这是关于什么的吗?我试过在很多方面改变我的代码但不幸的是我不能让它消失。谢谢。
答案 0 :(得分:1)
您已在函数的第一行中使用矩阵覆盖sigma1
,但在第二行中创建sigma2
时使用它。您应该更改的两行代码是:
sigma1 <- matrix( c(sigma1, covar1, covar1, sigma2), ncol = 2, nrow = 2, byrow = T) ;
sigma2 <- matrix( c(sigma1, covar2, covar2, sigma2), ncol = 2, nrow = 2, byrow = T)
答案 1 :(得分:1)
回答你已经覆盖了你的西格玛。我重新组织了你的代码以使其更具可读性
require(mvtnorm)
rcn <- function(n, covar1, covar2, sigma1, sigma2, eps, bias1, bias2){
Matrix1 <-
matrix(
c(sigma1, covar1
, covar1, sigma2)
, ncol = 2, nrow = 2, byrow = TRUE)
Matrix2 <-
matrix(
c(sigma1, covar2
, covar2, sigma2)
, ncol = 2, nrow = 2, byrow = TRUE)
m <- matrix(0, nrow = n, ncol = 2)
for(i in 1:n){
ind <- rbinom(1, 1, eps)
m[i,] <- (1 - ind)*rmvnorm(1, sigma = Matrix1) + ind*rmvnorm(1, sigma = Matrix2, mean = c(bias1, bias2) )
}
list(y1 = m[,1], y2 = m[,2])
}
rcn(20, 0.9, -0.9, 1, 1, 0.05, 0, 0)