首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有指定样本容量和概率的R中随机样本数据的生成

具有指定样本容量和概率的R中随机样本数据的生成
EN

Stack Overflow用户
提问于 2020-11-11 23:21:33
回答 2查看 682关注 0票数 0

我想用R来写一个模型,回答一个关于概率的一般问题。下面是一般性问题,然后是关于如何使用R代码回答它的具体问题。如果您知道一般问题的答案(与R代码分开),并且能够用简单的英语解释基本的统计原则,我也对此感兴趣!

问题:如果我分裂了一组n个对象,首先通过一个4路拆分器,然后通过一个7路拆分器(总共产生了28个不同的组),而每个拆分器的结果是一个随机分布(即,对象被大致平分),那么拆分的顺序是否会影响最后28个组的方差。如果我分成4,然后分成7,这和分裂成7,然后分成4有区别吗?如果一个分配器的方差比另一个要大,那么答案会改变吗?

具体的R问题:我如何写一个模型来回答这个问题?到目前为止,我已经尝试使用samplernorm生成示例数据。模拟4路分配器的样子如下所示:

sample(1:4, size=100000, replace=TRUE)

这基本上就像滚动一个四边的模具100,000次,并记录每个数字的实例数。我可以使用table函数对实例进行求和,这将给出如下的输出:

代码语言:javascript
运行
复制
> table(sample(1:4, size=100000, replace=TRUE))

    1     2     3     4 
25222 24790 25047 24941

现在,我想把这些输出中的每一个作为7向拆分的输入。我尝试将4路拆分保存为变量,然后将该向量插入size =变量中,如下所示:

代码语言:javascript
运行
复制
Split4way <- as.vector(table(sample(1:4, size=100000, replace=TRUE)))
as.vector(table(sample(1:7, size=Split4Way, replace=TRUE)))

但是当我这样做的时候,我得到了一个包含1行7列的向量,而不是4行7列的矩阵。看来,7向拆分的“大小”变量只使用4向拆分的4项输出中的1项,而不是使用其中的每一项。

代码语言:javascript
运行
复制
> as.vector(table(sample(1:7, size = Split4up, replace=TRUE)))
[1] 3527 3570 3527 3511 3550 3480 3588

那么,我如何生成一个表或列表来显示4路拆分的所有输出,然后是7路拆分,总共28次拆分?

是否有一个函数允许我自定义每个分裂设备的标准差?例如,我可以规定4路分离器的输出有x%的标准偏差,而7路分离器的输出有x%的标准偏差吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-12 09:30:22

我们可以通过编写一个函数来演示您的设置,该函数将模拟被传递到拆分器中的n对象。

想象一下,物体首先出现在4分配器的前面。让我们随机地给它分配一个从1到4的数字,以确定它是以哪一种方式分裂的。接下来是一个7分配器;我们也可以随机地给它分配一个从1到7的数字,以确定它将被放入哪个最终的bin中。

该设置如下所示:

代码语言:javascript
运行
复制
                                    Final bins

1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
1  2  3  4  5  6  7  1  2  3  4  5  6  7  1  2  3  4  5  6  7  1  2  3  4  5  6  7  
\__|__|__|__|__|_/   \__|__|__|__|__|_/   \__|__|__|__|__|_/   \__|__|__|__|__|_/  
        |                    |                    |                    |
  seven splitter       seven splitter       seven splitter      seven splitter         
        |                    |                    |                    |
        1                    2                    3                    4
         \___________________|____________________|___________________/
                                        |
                                   four splitter
                                        |
                                      input

我们可以看到,任何唯一的数字对都会导致对象在不同的垃圾箱中结束。

对于第二个设置,我们反转顺序,使七个拆分器位于第一位,但否则,每个对象仍然根据唯一的一对数字得到一个唯一的bin:

代码语言:javascript
运行
复制
1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
1  2  3  4  1  2  3  4  1  2  3  4  1  2  3  4  1  2  3  4  1  2  3  4  1  2  3  4   
\__|__|__/  \__|__|__/  \__|__|__/  \__|__|__/  \__|__|__/  \__|__|__/  \__|__|__/  
     |           |           |           |           |           |           |
4 splitter  4 splitter  4 splitter  4 splitter  4 splitter  4 splitter  4 splitter 
     |           |           |           |           |           |           |
     1           2           3           4           5           6           7
      \__________|___________|___________|___________|___________|__________/
                                         |
                                     7 splitter
                                         |
                                       input

请注意,我们可以画一个随机的1:4然后随机的1:7,反之亦然,但是在任何情况下,唯一的对将决定一个唯一的bin。对象最终进入的实际bin将根据应用这两个数字的顺序而改变,但这不会改变每个bin将得到传入的对象的1/28的事实,并且方差将保持不变。

这意味着为了模拟和比较这两个设置,我们只需要对传入的每个对象进行1:4和1:7的示例,然后以不同的顺序应用这两个数字来计算最终bin:

代码语言:javascript
运行
复制
simulate <- function(n) {
  df <- data.frame(fours  = sample(4, n, replace = TRUE),
                   sevens = sample(7, n, replace = TRUE))
  df$four_then_seven <- 7 * (df$fours - 1) + df$sevens
  df$seven_then_four <- 4 * (df$sevens - 1) + df$fours
  return(df)
}

因此,让我们来看看这对于传入的10个对象是如何进行的:

代码语言:javascript
运行
复制
set.seed(69) # Makes the example reproducible

simulate(10)
#>    fours sevens four_then_seven seven_then_four
#> 1      4      6              27              24
#> 2      1      5               5              17
#> 3      3      7              21              27
#> 4      2      2               9               6
#> 5      4      2              23               8
#> 6      4      3              24              12
#> 7      1      4               4              13
#> 8      3      2              16               7
#> 9      3      7              21              27
#> 10     3      2              16               7

现在,让我们做一个表,如果我们有100,000次抽水,那么每个垃圾箱中的数量:

代码语言:javascript
运行
复制
s <- simulate(100000)

seven_four <- table(s$seven_then_four)
seven_four
#> 
#>    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16 
#> 3434 3607 3539 3447 3512 3628 3564 3522 3540 3539 3544 3524 3552 3644 3626 3578 
#>   17   18   19   20   21   22   23   24   25   26   27   28 
#> 3609 3616 3673 3617 3654 3637 3542 3624 3568 3651 3486 3523

four_seven <- table(s$four_then_seven)
four_seven
#> 
#>    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16 
#> 3434 3512 3540 3552 3609 3654 3568 3607 3628 3539 3644 3616 3637 3651 3539 3564 
#>   17   18   19   20   21   22   23   24   25   26   27   28 
#> 3544 3626 3673 3542 3486 3447 3522 3524 3578 3617 3624 3523

如果你把这两个表从最小的数字排序到每个垃圾箱中的最大数字,你会发现它们实际上与它们的垃圾箱上的标签是相同的。计数的分布完全没有变化。这意味着方差/标准差在这两种情况下也是相同的:

代码语言:javascript
运行
复制
var(four_seven)
#> [1] 3931.439

var(seven_four)
#> [1] 3931.439

改变方差/标准差的唯一方法是“修正”拆分器,这样它们就没有相同的概率。

票数 2
EN

Stack Overflow用户

发布于 2020-11-12 17:59:01

我也很难解释你对方差和标准差的使用。我能想到的最好的方法就是不一致地“分裂”。

作为Allan代码的替代,您可以通过以下操作生成非均匀示例:

代码语言:javascript
运行
复制
# how should the alternatives be weighted (normalised probability is also OK)
a <- c(1, 2, 3, 4)  # i.e. last four times as much as first
b <- c(1, 1, 2, 2, 3, 3, 4)

x <- sample(28, 10000, prob=a %*% t(b), replace=TRUE)

请注意,probsample中自动规范化(即除以和)。您可以检查事情是否正在进行:

  • table((x-1) %% 4 + 1)应该接近a/sum(a) * 10000
  • table((x-1) %/% 4 + 1),应该接近b/sum(b) * 10000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64795647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档