我正在进行模拟研究,在生成满足某些条件的数据时遇到了一些问题。
我的第一个模拟数据如下。
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(。这是我想申请的条件。
- 如果A1>0.7(通过(&A2>0.8(通过(-->A3=1,概率为70%(意味着零的%30(
- 如果A1>0.7(通过(&A2<0.8(失败(-->A3=1,概率为30%
- 如果A1<0.7(失败(&A2>0.8(通过(-->A3=1,概率为90%
- 如果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