以指定的样本大小和概率在R中生成随机样本数据

如何解决以指定的样本大小和概率在R中生成随机样本数据

我想用R编写一个模型,该模型将回答有关概率的一般问题。下面是一般性问题,接下来是我关于如何使用R代码回答问题的具体问题。如果您知道一般问题的答案(与R代码分开),并且可以用简单的英语解释基本的统计原理,那么我也对此感兴趣!

问题:如果我将n个对象分成一组,则首先通过4向拆分器,然后通过7向拆分器(总共28个不同的组),每个拆分器都会产生随机分布(即对象的划分大致相等),划分的顺序是否会影响最终28个组的方差。如果我先分成4个然后分成7个,那和分成7个然后分成4个有什么不同?如果一个拆分器的方差大于另一个拆分器,答案是否会改变?

特定的R问题:如何编写模型来回答此问题?到目前为止,我已经尝试使用samplernorm生成示例数据。模拟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)

请注意,probsample中被自动归一化(即除以和)。您可以检查一切是否正常:

  • table((x-1) %% 4 + 1)应该接近a/sum(a) * 10000
  • table((x-1) %/% 4 + 1)应该接近b/sum(b) * 10000

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res