Partykit CTREE 问题:如何对每个终端节点内的观测值进行子集化(包括不属于 CTREE 的变量)

问题描述 投票:0回答:1

我想要一些关于我的代码的帮助。这是我第一次发帖,所以长度请原谅。

概述:我进行了 CTREE 分析,以确定与特定结果相关的某些交叉点。在我的 CTREE 中,我只使用了少数预测变量。一切进展顺利。现在,我想比较每个交叉点内其他变量的分布(不包含在 CTREE 中,但包含在我的更大数据集中)。

  • 例如,假设我的预测变量是年龄、性别和种族。我想找出每个终端节点/交叉点内教育水平的频率,并最终继续对它们进行跨组比较。

这是我迄今为止尝试过的一些代码,也是我在每个终端节点中对观察结果进行子集化的最接近的代码:

设置种子(418)

eddata_ctree2 <- ctree(eddata2$edavoidever ~ gender + age + rural + immigration_3cat + race + sexwork + transid + disid, data = eddata2, control = ctree_control(minsplit = 30))

绘图(eddata_ctree2)

终端节点<- unique(predict(eddata_ctree2, type = "node"))

按节点采样 <- lapply(terminal_nodes, function(node_id) { df_node <- eddata2[predict(eddata_ctree2, newdata = eddata2, type = "node") == node_id, ] return(df_node)
})

名称(按节点采样)<- as.character(terminal_nodes)

节点5<- samples_by_node[["5"]] node6 <- samples_by_node[["6"]] node8 <- samples_by_node[["8"]] node9 <- samples_by_node[["9"]] node10 <- samples_by_node[["10"]] node12 <- samples_by_node[["12"]] node13 <- samples_by_node[["13"]]

但是,我现在遇到的问题是子集数据集中的观测值数量不等于 CTREE 中的观测值数量。所有数据集都比关联节点有更多或更少的观察结果,我不确定这些额外或缺失的观察结果来自哪里。重要的是要注意,某些观察结果缺少预测变量的值(所以也许这就是问题所在?)

注意:当我使用 data_party (如下)时,它给了我正确的观察数量,但只包含 CTREE 中的变量,而不包含其他变量(在较大的数据集中 - eddata2)

永远5<- data_party (eddata_ctree2, id = 5)

如果您有任何见解或知道更好的方法来完成/解决此问题,请告诉我。

非常感谢!

rstudio treenode party ctree
1个回答
0
投票

我认为你想获得预测的“节点”并将其转化为一个因素。然后可以将其用于后续调查。为了获得可重复的说明,让我们仅通过萼片长度来预测鸢尾花种类:

library("partykit")
ct <- ctree(Species ~ Sepal.Length, data = iris)
plot(ct)

然后我们可以将拟合的节点/组作为分类因子变量添加到数据集中:

iris$node <- factor(predict(ct, newdata = iris, type = "node"))
head(iris, 3)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species node
## 1          5.1         3.5          1.4         0.2  setosa    2
## 2          4.9         3.0          1.4         0.2  setosa    2
## 3          4.7         3.2          1.3         0.2  setosa    2

这可以像任何其他因素变量一样使用,例如,用于创建探索性显示:

plot(Petal.Length ~ node, data = iris)

© www.soinside.com 2019 - 2024. All rights reserved.