r - 根据条件概率 + R 中的先前结果分配 0 或 1
问题描述
我正在做一项模拟研究,但在生成满足特定条件的数据时遇到了一些问题。
我的第一个模拟数据如下所示。
A1 A2 A3
1 0 0 0
2 0 1 1
3 0 0 1
-
1151 1 1 1
如您所见,N=1151,总结表明
A1 (0: 571, 1:580)
A2 (0: 591, 1:560)
A3 (0: 423, 1:728)
我必须根据以下条件概率生成数据(用于第二次模拟)
0 1
0 .87 .13
1 .2 .8
例如,第二个人拥有之前的数据如下所示,
A1 A2 A3
1 0 1 1
对于第二次模拟,A1 将有 87% 的“0”,A2 有 20% 的“0”,A3 有 80% 的“1”,我想根据这些概率生成日期。
我想知道如何用 R 代码编写这些。
我能想到的只有
M=(A1=='1')
rbinom(M,size=1,0.87)
我知道这是不对的。但是,基于我有限的 R 知识,我想不出其他任何东西。我很感激任何意见。
解决方案
这是一个单行解决方案:
apply(df, 2, function(x) rbinom(length(x), 1, c(0.13, 0.8)[x+1]))
这是有效的,因为您可以将概率向量传递给rbinom
. 您可以使用前一个样本的零和一个作为两个概率的索引,前提是您先向它们添加一个。
您只需要第二列的概率,因为它是第一列的补充。
使用apply
允许您为矩阵或数据框按列执行此操作。
为了演示,我将生成一个小的测试样本,它显示了一般原则:
set.seed(100)
df <- data.frame(A1 = rbinom(9, 1, 0.5), A2 = rbinom(9, 1, 0.2), A3 = rbinom(9, 1, 0.7))
df
#> A1 A2 A3
#> 1 0 0 1
#> 2 0 0 1
#> 3 1 1 1
#> 4 0 0 0
#> 5 0 0 1
#> 6 0 0 0
#> 7 1 0 1
#> 8 0 0 1
#> 9 1 0 0
所以现在...
apply(df, 2, function(x) rbinom(length(x), 1, c(0.13, 0.8)[x+1]))
#> A1 A2 A3
#> [1,] 1 0 1
#> [2,] 0 0 1
#> [3,] 1 0 0
#> [4,] 0 0 0
#> [5,] 1 0 1
#> [6,] 0 0 0
#> [7,] 0 0 1
#> [8,] 0 0 1
#> [9,] 0 0 0
由reprex 包(v0.3.0)于 2020-05-12 创建
推荐阅读
- amazon-web-services - AWS ALB/NLB 对 HAProxy 实例的重写请求?
- python - 如何在 numpy 嵌套数组中提取特定数组?
- apache-spark - 如何使用 pyspark 获取 Delta 表的所有当前分区?
- sql - 如何创建在运行时只能访问选定表的角色
- azure - Azure 事件网格主题日志 - 无法解析名为“AegPublishFailureLogs”的表或列表达式
- resize - 更改幻灯片大小时未调整文本大小
- vue.js - 寻找有关为 VueJS 应用程序构建图标选择器的指南。如何从 VueJS 组件内的文件夹中加载和显示所有 Svg?
- webpack - webpack 将清单注入服务工作者
- c++ - 从类转换为具有不同模板类型的相同类
- node.js - 为 Firebase(Firestore、Cloud Storage 等)创建跨 sdk 包装器