已知独立假设时从边际分布计算联合分布(R dplyr实现)
问题原因
你直接连接后相乘得到的number.mult总和不为1,核心是两个表的number列均为对应维度下的联合概率,且两个表中公共特征feature2的边际分布不统一:
- 对
my_tib1按feature2分组求和,得到该表下feature2的边际概率:AA=0.45,BB=0.55 - 对
my_tib2按feature2分组求和,得到该表下feature2的边际概率:AA=0.4,BB=0.6
直接将两个联合概率相乘,实际计算的是P(f1,f2) * P(f2,f3) = P(f1,f2,f3) * P(f2),额外多乘了一次feature2的概率权重,且两个表的feature2权重不统一,最终求和自然不为1。
实现方案
按照特征独立假设(给定feature2时feature1与feature3独立),要得到总和为1的三元联合分布,只需要先将其中一个表转换为给定feature2的条件概率,再和另一个表的联合概率相乘即可。以下代码默认保留my_tib1中的feature2边际分布作为基准,输出结构完全匹配你的预期:
library(dplyr) # 步骤1:将my_tib2转换为给定feature2时feature3的条件概率 my_tib2_cond <- my_tib2 %>% group_by(feature2) %>% # 组内归一化得到条件概率P(f3|f2) mutate(number.y = number / sum(number)) %>% ungroup() %>% select(feature2, feature3, number.y) # 步骤2:连接计算联合概率 result <- my_tib1 %>% rename(number.x = number) %>% full_join(my_tib2_cond, by = "feature2") %>% mutate(number.mult = number.x * number.y)
结果验证
运行后得到的结果共12行,number.mult列求和为1:
# A tibble: 12 × 6 feature1 feature2 number.x feature3 number.y number.mult <chr> <chr> <dbl> <chr> <dbl> <dbl> 1 A AA 0.1 TT 0.25 0.025 2 A AA 0.1 FF 0.75 0.075 3 A BB 0.1 TT 0.667 0.0667 4 A BB 0.1 FF 0.333 0.0333 5 B AA 0.3 TT 0.25 0.075 6 B AA 0.3 FF 0.75 0.225 7 B BB 0.4 TT 0.667 0.267 8 B BB 0.4 FF 0.333 0.133 9 C AA 0.05 TT 0.25 0.0125 10 C AA 0.05 FF 0.75 0.0375 11 C BB 0.05 TT 0.667 0.0333 12 C BB 0.05 FF 0.333 0.0167
如果你需要保留my_tib2中的feature2边际分布作为基准,只需要把上述步骤中两个表的处理顺序调换,对my_tib1做组内归一化得到P(f1|f2),再和my_tib2的联合概率相乘即可。
内容的提问来源于stack exchange,提问作者Tea Tree
相关产品推荐
相关产品推荐

