首页 > 解决方案 > 根据条件概率 + 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 知识,我想不出其他任何东西。我很感激任何意见。

标签: 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 创建


推荐阅读