我有一个由四列组成的数据框,第一列用于识别用户和产品,最后两列是条件概率。我的最终数据框如下所示:
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(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中构建这个矩阵?
提前致谢
答案 0 :(得分: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