【问题标题】:R - Construct conditional probability matrixR - 构造条件概率矩阵
【发布时间】:2017-07-31 13:12:31
【问题描述】:

我有一个由四列组成的数据框,前两列用于识别用户和产品,后两列是条件概率。我的最终数据框如下所示:

         id1    id2       p(id2|id1)   p(id1|id2)
1        1      1         0.1111111    4.290376e-04
2        1      2         0.22222222   8.286866e-03
3        1      3         0.22222222   2.639876e-04
4        1      4         0.44444444   2.850284e-03
5        2      1         0.09090909   1.644470e-03
6        2      5         0.2727273    3.286420e-04
7        2      6         0.4545455    1.002740e-03
8        2      3         0.1818182    1.738019e-05

之后会有更多用户。如您所见,对于属于同一个 id1 的 id2,我们可以有多个不同的值。我想找到获得某个 id2 的概率,假设用户已经有一些 id2,即我有兴趣找到

p(id2 = x | id2 = y) = sum_id1 ( p(id2 = x | id1 ) * p(id1 | id2 = y) )

并将其构造为所有 x 和 y 的矩阵。在这种情况下,我们有 6 个不同的 id2,所以生成的矩阵应该是这样的

     1             2              3             4       5      6
1    NA            0.0009207628   3.091197e-05  ....    ....   ....
2    9.534169e-05  NA             ...
3    0.0003943363  ...
4    ...
5    ...
6    ...

我们得到元素 (1,2) 为

p(id2=1 | id2 = 2) = p(id2 = 1 | id1 = 1) * p(id1 = 1 | id2 = 2) 
= 0.1111111*8.286866e-03 = 0.0009207628.

对于元素 (1,3),我们得到 ​​p>

p(id2 = 1 | id2 = 3) = p(id2 = 1 | id1 = 1) * p(id1 = 1 | id2 = 3)
+ p(id2 = 1 | id1 = 2) * p(id1 = 2 | id2 = 3) 
= 0.1111111 * 2.639876e-04 + 0.09090909 * 1.738019e-05 = 3.091197e-05

我希望很清楚我想要完成什么。有谁知道我如何在 R 中构造这个矩阵?

提前致谢

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    它不漂亮,但我认为这可行:

    vec1 = c(0.1111111, 0.22222222, 0.22222222, 0.44444444, 0.09090909,
             0.2727273, 0.4545455, 0.1818182)
    vec2 = c(4.290376e-04, 8.286866e-03, 2.639876e-04, 2.850284e-03,
             1.644470e-03, 3.286420e-04, 1.002740e-03, 1.738019e-05)
    
    df <- data.frame(id1 = rep(c(1, 2), each = 4),
                     id2 = c(seq.int(4), 1, 5, 6, 3),
                     p.id2.id1 = vec1,
                     p.id1.id2 = vec2)
    
    > df    
    ##   id1 id2  p.id2.id1    p.id1.id2
    ## 1   1   1 0.11111110 4.290376e-04
    ## 2   1   2 0.22222222 8.286866e-03
    ## 3   1   3 0.22222222 2.639876e-04
    ## 4   1   4 0.44444444 2.850284e-03
    ## 5   2   1 0.09090909 1.644470e-03
    ## 6   2   5 0.27272730 3.286420e-04
    ## 7   2   6 0.45454550 1.002740e-03
    ## 8   2   3 0.18181820 1.738019e-05
    
    mat = matrix(NA, nrow = length(unique(df$id2)), ncol = length(unique(df$id2)))
    
    for (i in 1:length(unique(df$id2))) {
      for (j in 1:length(unique(df$id2))) {
        if (i != j) {
          val = 0
          for (k in 1:length(unique(df$id1))) {
            if (length(df$p.id2.id1[df$id1 == k & df$id2 == i]) > 0 &
                length(df$p.id2.id1[df$id1 == k & df$id2 == j]) > 0) {
              val <-val + df$p.id2.id1[df$id1 == k & df$id2 == i] *
                df$p.id1.id2[df$id1 == k & df$id2 == j]
            }
          }
          mat[i, j] <- val
        }
      }  
    }
    

    结果如下:

    > mat
    
    ##              [,1]         [,2]         [,3]         [,4]         [,5]         [,6]
    ## [1,]           NA 0.0009207628 3.091197e-05 0.0003166982 2.987655e-05 9.115818e-05
    ## [2,] 9.534169e-05           NA 5.866391e-05 0.0006333964 0.000000e+00 0.000000e+00
    ## [3,] 3.943363e-04 0.0018415258           NA 0.0006333964 5.975310e-05 1.823164e-04
    ## [4,] 1.906834e-04 0.0036830515 1.173278e-04           NA 0.000000e+00 0.000000e+00
    ## [5,] 4.484919e-04 0.0000000000 4.740052e-06 0.0000000000           NA 2.734746e-04
    ## [6,] 7.474864e-04 0.0000000000 7.900087e-06 0.0000000000 1.493827e-04           NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2021-05-11
      • 2013-11-29
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多