首页 > 解决方案 > 使用 prob 包计算 R 中的条件概率

问题描述

我的数据如下所示:

d

#> # A tibble: 220 x 2
#>    smoker pain 
#>    <chr>  <chr>
#>  1 Smoker Pain 
#>  2 Smoker Pain 
#>  3 Smoker Pain 
#>  4 Smoker Pain 
#>  5 Smoker Pain 
#>  6 Smoker Pain 
#>  7 Smoker Pain 
#>  8 Smoker Pain 
#>  9 Smoker Pain 
#> 10 Smoker Pain 
#> # … with 210 more rows

是两个变量之间的组合:吸烟者和疼痛。

d %>% 
  count(smoker, pain, sort = T)
#> # A tibble: 4 x 3
#>   smoker    pain        n
#>   <chr>     <chr>   <int>
#> 1 No smoker No pain   107
#> 2 Smoker    Pain       70
#> 3 Smoker    No pain    35
#> 4 No smoker Pain        8

我想计算一个人感到疼痛的概率,因为他是吸烟者 P(pain|smoker):

library(tidyverse)
library(prob)

d <- probspace(d)
Prob(d, event = smoker == "Smoker", given = pain == "Pain")
#> [1] 0.01282051

据我所知,这个值一定是感到疼痛的吸烟者的百分比:

70/105

#> [1] 0.667

这里有什么问题?

这是数据的代码:

smoker <- c(rep("Smoker", 105), rep("No smoker", 115))
pain <- c(rep("Pain", 70), rep("No pain", 35), rep("Pain", 8), rep("No pain", 107))

d <- tibble(smoker, pain)

标签: rprobability

解决方案


d <- cbind(id = seq(nrow(d)),d)我认为您应该在之后再添加一行d <- tibble(smoker, pain),即

d <- tibble(smoker, pain)
d <- cbind(id = seq(nrow(d)),d)

那么你会得到想要的结果

> Prob(d, event = pain == "Pain", given = smoker == "Smoker")
[1] 0.6666667

注意:这样做的原因是,Prob()计算intersect()事件和给定条件之间的时间。当您将数据框用于概率空间时,交叉点中的重复项将被丢弃。为避免这种情况,您需要手动添加额外的信息来区分数据框中的行d,以便可以保存所有重复项直到计算结束。


推荐阅读