背景:假设我有一个决策树,其中包含节点结果发生的概率。我需要计算每个叶子上每个最终结果的联合发生概率。
方法:我尝试使用R中的data.tree
沿树的每个叶子的祖先聚合。
问题:我是data.tree的初学者,并且不知道这是否可能。
这是一个例子(使用sum而不是prod作为聚合,因为它更容易手动计算):
library(data.tree)
set.seed(123)
# Create a tree
thetree <- CreateRegularTree(height = 3, branchingFactor = 2, parent = Node$new("1"))
thetree$Set(p = 1:thetree$totalCount/10)
print(thetree, "p")
# levelName p
# 1 1 0.1
# 2 ¦--1.1 0.2
# 3 ¦ ¦--1.1.1 0.3
# 4 ¦ °--1.1.2 0.4
# 5 °--1.2 0.5
# 6 ¦--1.2.1 0.6
# 7 °--1.2.2 0.7
我尝试了聚合功能
# But this returns aggregations across all children on each level
thetree$Do(function(x) x$result <- Aggregate(x, "p", sum))
print(thetree, "p", "result")
# levelName p result
# 1 1 0.1 0.7
# 2 ¦--1.1 0.2 0.7
# 3 ¦ ¦--1.1.1 0.3 0.3
# 4 ¦ °--1.1.2 0.4 0.4
# 5 °--1.2 0.5 1.3
# 6 ¦--1.2.1 0.6 0.6
# 7 °--1.2.2 0.7 0.7
我也尝试了traversal = "ancestor"
论证但没有成功。
我想要的结果涉及沿着从祖先到每片叶子的每条路径的聚合,如 - 叶子1.1.1。 - 例如,0.3 + 0.2 + 0.1。
# Desired result
# levelName p result
# 1 1 0.1 NA
# 2 ¦--1.1 0.2 0.3
# 3 ¦ ¦--1.1.1 0.3 0.6
# 4 ¦ °--1.1.2 0.4 0.7
# 5 °--1.2 0.5 0.6
# 6 ¦--1.2.1 0.6 1.2
# 7 °--1.2.2 0.7 1.3
答案 0 :(得分:2)
为此,Do派上用场了:
thetree$result <- thetree$p
traversal <- Traverse(thetree, filterFun = isNotRoot)
Do(traversal, function(node) node$result <- node$parent$result + node$p)
然后得到所需的结果:
print(thetree, "p", "result")
levelName p result
1 1 0.1 0.1
2 ¦--1.1 0.2 0.3
3 ¦ ¦--1.1.1 0.3 0.6
4 ¦ °--1.1.2 0.4 0.7
5 °--1.2 0.5 0.6
6 ¦--1.2.1 0.6 1.2
7 °--1.2.2 0.7 1.3