【问题标题】:Generate multivariate normal data with unequal sample sizes生成样本量不等的多元正态数据
【发布时间】:2019-03-09 03:27:41
【问题描述】:

我想生成多元随机数据,使用 MASS::mvrnorm(或者,可能证明是 rnorm)来操纵样本大小和方差。这相当简单,然而,诀窍是我打算用这个生成的数据模拟一个统计数据,比较两个 不同 样本大小(不同长度)。本质上,这创建了一个 3X3 设计,其中我有 2 个不同样本大小的三个级别(例如 [450,150]、[300,300]、[150,450])与三个方差级别(例如 [1,1]、[1,3] , [1,10])。

    n <- c(450,150,300,300,150,450) # sample sizes

    sig <- matrix(c(1,1,1,3,1,10), nrow=2, byrow=F) # variance

    mu <- (5, 5, 5) # mean is constant across all conditions 

    mvrnorm(n, mu, sig) 

我确信我必须遍历我的样本量向量,就像我只为每个条件生成 一个 样本量一样。但由于我为每个条件生成两个样本大小,我不确定如何执行此操作。

【问题讨论】:

    标签: r for-loop random multivariate-testing data-generation


    【解决方案1】:

    如果我理解正确,您需要六个样本:从 N(5, 1) 抽取 450 个样本,从 N(5, 1) 抽取 150 个样本,从 N(5, 1) 抽取 300 个样本,从 N(5) 抽取 300 个样本, 3),从 N(5, 1) 抽取 150 次,从 N(5, 10) 抽取 450 次。你可以通过

    samples <- mapply(rnorm, n = c(450,150,300,300,150,450), sd = c(1,1,1,3,1,10))
    

    显然,由于大小,我会省略输出,但你可以明白我的意思:

    str(samples)
    List of 6
     $ : num [1:450] 0.785 -0.21 0.192 -0.265 -0.501 ...
     $ : num [1:150] 1.224 -0.315 -0.131 -0.923 0.407 ...
     $ : num [1:300] -0.413 -1.081 0.469 1.332 0.244 ...
     $ : num [1:300] -0.748 -0.628 0.753 1.4 3.883 ...
     $ : num [1:150] 0.376 -1.193 1.133 1.839 1.528 ...
     $ : num [1:450] 2.19 -3.17 2.45 0.75 -8.4 ...
    

    然后你想在samples[[1]]samples[[2]]之间运行某种测试,然后在samples[[3]]samples[[4]]之间,最后在samples[[5]]samples[[6]]之间运行。我不知道你打算运行什么测试,但如果你有一个测试函数,那应该很简单:只需输入正确的列表元素。

    更新

    根据评论,你需要得到你想要的所有样本组合是

    f <- function(sample_size_pairs, sd_pairs) {
        return(sapply(1:nrow(sample_size_pairs), function(i) {
            mapply(rnorm, n = sample_size_pairs[i, ], sd = sd_pairs[i])
        }))
    }
    
    sample_sizes <- matrix(c(rep(c(450, 150), 3), rep(c(150, 450), 3),
                             rep(c(300, 300), 3)), ncol = 2, byrow = TRUE)
    sds <- matrix(rep(c(1, 1, 1, 3, 1, 10), 3), ncol = 2, byrow = TRUE)
    
    g <- f(sample_sizes, sds)
    
    str(g)
    
    List of 9
     $ :List of 2
      ..$ : num [1:450] 1.4243 1.733 0.5004 -0.8036 -0.0101 ...
      ..$ : num [1:150] -0.0607 0.1797 0.3787 -0.6676 -1.4352 ...
     $ :List of 2
      ..$ : num [1:450] -0.0766 -0.1407 -0.4893 0.2251 1.0174 ...
      ..$ : num [1:150] -1.8814 -1.3532 -1.2888 -0.0542 0.2637 ...
     $ :List of 2
      ..$ : num [1:450] 1.945 -1.375 -1.258 0.292 -0.208 ...
      ..$ : num [1:150] -1.291 -0.557 -1.199 1.385 -2.062 ...
     $ :List of 2
      ..$ : num [1:150] -2.461 -0.345 -1.454 -0.286 0.942 ...
      ..$ : num [1:450] -0.75 -0.636 -0.488 1.818 -0.585 ...
     $ :List of 2
      ..$ : num [1:150] -1.238 -0.765 -1.447 -1.153 -1.466 ...
      ..$ : num [1:450] 2.5461 0.9368 -0.0503 -0.9727 -1.4101 ...
     $ :List of 2
      ..$ : num [1:150] 0.7209 2.4342 -0.7617 0.0285 -1.3297 ...
      ..$ : num [1:450] -0.6882 0.0927 -0.8981 -0.4088 1.3421 ...
     $ : num [1:300, 1:2] 2.217 -0.161 -0.976 0.26 -0.362 ...
     $ : num [1:300, 1:2] 0.456 -0.112 -0.541 3.759 0.32 ...
     $ : num [1:300, 1:2] 0.165 0.247 -0.187 -0.624 -1.335 ...
    

    【讨论】:

    • 谢谢。就是这样。有九个条件,而不是六个。 Sigma (SD) 有一个上限和下限,所以我不确定 mapply 是否有效。它是来自 N(5, 1, 1)、N(5, 1, 3) 和 N(5, 1, 10) 的样本大小 450 和 150。然后同样从每个 N(5, 1, 1)、N(5, 1, 3) 和 N(5, 1, 10) 中抽取 150 和 450 个样本,最后从每个样本中抽取 300 和 300 个样本。
    • 谢谢!我很确定这行得通。我看到的唯一障碍是,当我玩弄输出并根据样本大小 (450,150) 条件制作数据帧 (as.data.frame(dat[[1]]) 时,尺寸为 450x2(生成所有 450x2 单元格中的值)。为什么数据框中的两列都有 450 个观察值,而不是 150 个观察值?
    猜你喜欢
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多