如何解决以指定的样本大小和概率在R中生成随机样本数据
我想用R编写一个模型,该模型将回答有关概率的一般问题。下面是一般性问题,接下来是我关于如何使用R代码回答问题的具体问题。如果您知道一般问题的答案(与R代码分开),并且可以用简单的英语解释基本的统计原理,那么我也对此感兴趣!
问题:如果我将n个对象分成一组,则首先通过4向拆分器,然后通过7向拆分器(总共28个不同的组),每个拆分器都会产生随机分布(即对象的划分大致相等),划分的顺序是否会影响最终28个组的方差。如果我先分成4个然后分成7个,那和分成7个然后分成4个有什么不同?如果一个拆分器的方差大于另一个拆分器,答案是否会改变?
特定的R问题:如何编写模型来回答此问题?到目前为止,我已经尝试使用sample
和rnorm
生成示例数据。模拟4路分配器看起来像这样:
sample(1:4,size=100000,replace=TRUE)
这基本上就像滚动4面骰子100,000次并记录每个数字的实例数。我可以使用table
函数对实例求和,这给了我这样的输出:
> table(sample(1:4,replace=TRUE))
1 2 3 4
25222 24790 25047 24941
现在,我想获取每个输出并将它们用作 input 进行7路拆分。
我尝试将4向拆分保存为变量,然后将矢量插入size =
变量中,如下所示:
Split4way <- as.vector(table(sample(1:4,replace=TRUE)))
as.vector(table(sample(1:7,size=Split4Way,replace=TRUE)))
但是当我这样做时,我得到的是一个有1行7列的向量,而不是有4行7列的矩阵。看来,用于7路拆分的“ size”变量仅使用4路拆分的4个输出中的1个,而不使用其中的每个。
> as.vector(table(sample(1:7,size = Split4up,replace=TRUE)))
[1] 3527 3570 3527 3511 3550 3480 3588
那么,如何生成一个表或列表来显示4路分割后跟7路分割的所有输出,总共28个分割?
AND
有没有可以让我自定义每个分割设备标准偏差的功能?例如,我是否可以说4路分离器的输出的标准偏差为x%,而7路分离器的输出的标准偏差为x%?
解决方法
我们可以通过编写一个函数来模拟您的设置,该函数将模拟n
对象被传递到拆分器中。
想象一下,对象首先到达4分割器。让我们为它分配一个从1到4的数字,以确定它的分割方式。接下来是七分离器。我们还可以为它随机分配一个从1到7的数字,以确定它将最终进入哪个最终bin。
设置如下:
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:
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,反之亦然,但是在任何一种情况下,唯一对都会确定唯一斌对象最终进入的实际仓位将根据两个数字的应用顺序而变化,但这不会改变每个仓位将获得传入的对象的1/28,并且方差保持不变的事实。
这意味着要模拟和比较这两个设置,对于传入的每个对象,我们只需要从1:4和1:7进行采样,然后以不同的顺序应用这两个数字即可计算出最终的bin:
simulate <- function(n) {
df <- data.frame(fours = sample(4,n,replace = TRUE),sevens = sample(7,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个对象如何播放:
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次抽奖,让我们来制作一个每个垃圾箱中的数量的表:
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
如果在每个容器中按从最小到最大的顺序对这两个表进行排序,则除了容器上的标签外,它们实际上是相同的。计数的分布完全不变。这意味着两种情况下的方差/标准差也相同:
var(four_seven)
#> [1] 3931.439
var(seven_four)
#> [1] 3931.439
改变方差/标准差的唯一方法是“固定”分离器,使它们不具有相同的概率。
,我也在努力解释您对方差和标准差的使用。我能想到的最好的办法就是不均匀地进行“分裂”
作为Allan代码的替代方法,您可以执行以下操作来生成非均匀样本:
# 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,4)
x <- sample(28,10000,prob=a %*% t(b),replace=TRUE)
请注意,prob
在sample
中被自动归一化(即除以和)。您可以检查一切是否正常:
-
table((x-1) %% 4 + 1)
应该接近a/sum(a) * 10000
-
table((x-1) %/% 4 + 1)
应该接近b/sum(b) * 10000
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。