r-根据条件概率+以前的模拟数据指定0或1



我正在进行模拟研究,在生成满足某些条件的数据时遇到了一些问题。

我的第一个模拟数据如下。

A1    A2
1    0.8    6  
2    0.5    3   
3    0.9    2 
...
1000

这就是我生成A1&A2

set.seed(47)
df <- data.frame(A1 = rnorm(1000, mean=0.7, sd=0.1), A2 = rnorm(1000, mean=4, sd=1))
df

在表格格式中,这就是条件语句的外观,其中0=失败,1=通过,表中的输出是A3获得1的概率。

A1  0     1
A2

0      0.1   0.3
1      0.9   0.7

以下是文字解释:

我想要基于前两行的条件概率生成第三行(A3(。这是我想申请的条件。

  1. 如果A1>0.7(通过(&A2>0.8(通过(-->A3=1,概率为70%(意味着零的%30(
  2. 如果A1>0.7(通过(&A2<0.8(失败(-->A3=1,概率为30%
  3. 如果A1<0.7(失败(&A2>0.8(通过(-->A3=1,概率为90%
  4. 如果A1<0.7(失败(&A2<0.8(失败(-->A3=1,概率为10%

我希望我的逻辑是合理的。如果我需要更多的数据或文字来更好地解释,请告诉我。非常感谢。

您可以在这里使用一个小技巧,将逻辑向量转换为整数,然后用二进制计数。

如果你做逻辑测试df$A1 >= 0.7,你会得到一个TRUE和FALSE值的向量。如果你做as.numeric(df$A1 >= 0.7),你得到了1和0的等价向量。诀窍是对两个变量都这样做,但将第二个向量乘以2。现在,如果你把两个向量加在一起,你会得到一个0到3之间的数字,它对应于你的真值表:

  • A1通过,A2通过=3
  • A1失败,A2通过=2
  • A1通过,A2失败=1
  • A1失败,A2失败=0

请注意,如果我们在这些数字上加一,就会得到一个介于一到四之间的值。因此,我们可以将它们用作概率向量的索引:

probs <- c(0.1, 0.3, 0.9, 0.7)[(df$A1 >= 0.7) + 2*(df$A2 >= 0.8)]

这意味着我们可以使用rbinom生成随机二进制数,比如

df$A3 <- rbinom(1000, 1, probs)

结果:

head(df)
#>          A1       A2 A3
#> 1 0.8994696 5.345481  1
#> 2 0.7711143 3.662635  1
#> 3 0.7185405 3.125840  1
#> 4 0.6718235 3.914527  0
#> 5 0.7108776 3.366858  1
#> 6 0.5914263 2.082173  0

创建于2022-09-30,reprex v2.0.2

最新更新