基于特定条件使用R语言expand.grid()实现硬币抛掷概率计算
R代码实现双硬币两次抛掷的似然计算
步骤说明
- 生成参数组合:创建p1、q1、q2的渐变网格,覆盖从(coin1=1, coin2=0)到(coin1=0, coin2=1)的所有情况。
- 定义12种抛掷结果:分为三类场景(两次coin1、各抛一次、两次coin2),每类4种结果。
- 批量计算似然:对每组参数,计算每种结果的似然值(场景选择概率 × 结果出现概率)。
完整代码
# 安装并加载所需包(首次运行需执行install.packages) # install.packages("tidyverse") library(tidyverse) # 1. 生成参数组合:p1、q1、q2从0到1渐变,步长0.2可自定义 params <- expand.grid( p1 = seq(0, 1, by = 0.2), q1 = seq(0, 1, by = 0.2), q2 = seq(0, 1, by = 0.2) ) %>% mutate(p2 = 1 - p1) # 添加1-p1列 # 2. 定义所有12种抛掷结果及对应正面次数 scenario1 <- data.frame( scenario = "两次抛coin1", result = c("HH", "HT", "TH", "TT"), h_coin1 = c(2, 1, 1, 0), h_coin2 = 0 ) scenario2 <- data.frame( scenario = "coin1和coin2各抛一次", result = c("HH", "HT", "TH", "TT"), h_coin1 = c(1, 1, 0, 0), h_coin2 = c(1, 0, 1, 0) ) scenario3 <- data.frame( scenario = "两次抛coin2", result = c("HH", "HT", "TH", "TT"), h_coin1 = 0, h_coin2 = c(2, 1, 1, 0) ) all_results <- rbind(scenario1, scenario2, scenario3) %>% mutate(full_result = paste(scenario, result, sep = "_")) # 3. 编写似然计算函数 calc_likelihood <- function(p1, q1, q2) { p2 <- 1 - p1 all_results %>% mutate( likelihood = case_when( # 两次coin1:场景概率p1² × 结果概率 scenario == "两次抛coin1" ~ p1^2 * (q1^h_coin1) * ((1 - q1)^(2 - h_coin1)), # 各抛一次:场景概率2*p1*p2 × 结果概率(两种顺序) scenario == "coin1和coin2各抛一次" ~ 2 * p1 * p2 * (q1^h_coin1) * ((1 - q1)^(1 - h_coin1)) * (q2^h_coin2) * ((1 - q2)^(1 - h_coin2)), # 两次coin2:场景概率p2² × 结果概率 scenario == "两次抛coin2" ~ p2^2 * (q2^h_coin2) * ((1 - q2)^(2 - h_coin2)) ) ) %>% select(full_result, likelihood) } # 4. 批量计算所有参数组合的似然 final_output <- params %>% mutate(likelihood_data = pmap(list(p1, q1, q2), calc_likelihood)) %>% unnest(likelihood_data) # 可选:转换为宽表格式,方便查看单组参数下的所有结果似然 final_wide <- final_output %>% pivot_wider(names_from = full_result, values_from = likelihood) # 查看前5行结果 head(final_wide)
代码解释
- 参数组合:用
expand.grid生成所有p1、q1、q2的笛卡尔积,步长by可按需调整(比如改成0.1会生成更密集的参数点)。 - 结果定义:明确三类场景的12种结果,记录每种结果中两枚硬币的正面次数,简化概率计算。
- 似然计算:
- 两次抛同一硬币:场景概率为对应硬币选择概率的平方,结果概率为二项分布概率。
- 各抛一次:场景概率为两种顺序的概率之和(2p1p2),结果概率为两枚硬币各自结果概率的乘积。
- 批量处理:用
pmap遍历所有参数组合,自动完成似然计算,最后可转成宽表直观查看每组参数的12种结果似然。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

