从污染的双变量正态分布中生成变量的问题

时间:2016-02-25 15:55:45

标签: r statistics

我编写了这个简单的函数,以便从受污染的二元正态分布中生成元组。它的作用是执行伯努利实验并基于结果,即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]
你能告诉我这是关于什么的吗?我试过在很多方面改变我的代码但不幸的是我不能让它消失。谢谢。

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)