我想用R来写一个模型,回答一个关于概率的一般问题。下面是一般性问题,然后是关于如何使用R代码回答它的具体问题。如果您知道一般问题的答案(与R代码分开),并且能够用简单的英语解释基本的统计原则,我也对此感兴趣!
问题:如果我分裂了一组n个对象,首先通过一个4路拆分器,然后通过一个7路拆分器(总共产生了28个不同的组),而每个拆分器的结果是一个随机分布(即,对象被大致平分),那么拆分的顺序是否会影响最后28个组的方差。如果我分成4,然后分成7,这和分裂成7,然后分成4有区别吗?如果一个分配器的方差比另一个要大,那么答案会改变吗?
具体的R问题:我如何写一个模型来回答这个问题?到目前为止,我已经尝试使用sample
和rnorm
生成示例数据。模拟4路分配器的样子如下所示:
sample(1:4, size=100000, replace=TRUE)
这基本上就像滚动一个四边的模具100,000次,并记录每个数字的实例数。我可以使用table
函数对实例进行求和,这将给出如下的输出:
> table(sample(1:4, size=100000, replace=TRUE))
1 2 3 4
25222 24790 25047 24941
现在,我想把这些输出中的每一个作为7向拆分的输入。我尝试将4路拆分保存为变量,然后将该向量插入size =
变量中,如下所示:
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项,而不是使用其中的每一项。
> 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%的标准偏差吗?
发布于 2020-11-12 09:30:22
我们可以通过编写一个函数来演示您的设置,该函数将模拟被传递到拆分器中的n
对象。
想象一下,物体首先出现在4分配器的前面。让我们随机地给它分配一个从1到4的数字,以确定它是以哪一种方式分裂的。接下来是一个7分配器;我们也可以随机地给它分配一个从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,反之亦然,但是在任何情况下,唯一的对将决定一个唯一的bin。对象最终进入的实际bin将根据应用这两个数字的顺序而改变,但这不会改变每个bin将得到传入的对象的1/28的事实,并且方差将保持不变。
这意味着为了模拟和比较这两个设置,我们只需要对传入的每个对象进行1:4和1:7的示例,然后以不同的顺序应用这两个数字来计算最终bin:
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个对象是如何进行的:
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
改变方差/标准差的唯一方法是“修正”拆分器,这样它们就没有相同的概率。
发布于 2020-11-12 17:59:01
我也很难解释你对方差和标准差的使用。我能想到的最好的方法就是不一致地“分裂”。
作为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, 2, 2, 3, 3, 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
https://stackoverflow.com/questions/64795647
复制相似问题