【问题标题】:Conditional partitioning条件分区
【发布时间】:2018-08-01 07:01:42
【问题描述】:

我想使用变量 V1 对变量 V2 进行分区。 V1 依赖于第三个变量 V3。

在以下 R 代码中,变量 V1 取决于变量 V3,例如当 V3 等于 10 且 V2 为 1 时,V1 等于 1。

有没有算法可以做到这一点?

library(partykit)
set.seed(100)
V1<-sample(100);V2<-ifelse(V1>50,1,0);V3<-sample(1:10,100,replace=T);
V1[V3==10&V2==1]<-5

ctree(V2~V1+V3)
#ctree output :

      V1<=50
      ___|___  
      |     |
    V1<=5   1
   __|___
   |     |
 V3<=6   0
 ___|___  
 |      | 
0.88  0.98

my_algorithm(V2~V1|V3) 
#Expected output (optimal tree) :

 V1>50
   |
_______
|     |
1     V3<10
        |
     _______
     |     |
     0     1

例如 ctree 没有给出最佳分类(见上文)。

我的问题可能不清楚,请随时编辑。谢谢。

【问题讨论】:

  • 是的,根本不清楚,也许将您的示例从每个向量 100 个项目减少到 10 个,并给我们预期的输出
  • @Moody_Mudskipper 预期的输出是树状的。 “图表”是否更清晰?
  • 目前还不清楚你在找什么。如果要将观察到的数据分成三组,可以使用split()。如果您想设置一个也可以应用于新数据的分区工具,您可以考虑示例vignette("partykit", package = "partykit")。可能,data.tree 包也可能很有趣。
  • @AchimZeileis 谢谢你的帮助。我想要一个可以应用于新数据的分区工具。我编辑了我的帖子以添加一个来自partykit 包的 ctree 示例。如您所见,生成的树不是最优的。这是因为 V1 依赖于 V3,而 V2 不(直接)依赖于 V3。
  • @AchimZeileis 。这个问题是一个更普遍的问题的一部分:stats.stackexchange.com/questions/330153/…。也许这有助于更好地理解这个问题背后的动机。

标签: r tree partitioning rpart party


【解决方案1】:

我仍然不完全理解您的问题的重点,因此可能没有完整的答案。但是我可以制作几个cmets:

(1) 您描述的情况是回归变量V1V3 之间的依赖关系。这与V2 不同,具体取决于V1V3 之间的交互。你展示的树结构对应的是后者,而不是前者。

(2) 您显示的树不是“最佳的”,因为 - 由于 (1) - 第二个子组中仍然存在错误分类:

expected_tree <- ifelse(V1 > 50, "V1 > 50",
  ifelse(V3 < 10, "V1 <= 50 & V3 < 10", "V1 <= 50 & V3 = 10"))
split(V2, expected_tree)
## $`V1 <= 50 & V3 < 10`
##  [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [39] 0 0 0 0 0 0 0 0
## 
## $`V1 <= 50 & V3 = 10`
##  [1] 1 1 0 1 1 0 1 0 0 1 1 1
## 
## $`V1 > 50`
##  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [39] 1 1 1 1

(3) 我无法复制您的 ctree() 结果。它确实找到了V1V3 之间的交互,尽管在V3 的另一个截止点 - 由于 (2)。

ctree(V2 ~ V1 + V3)
## Model formula:
## V2 ~ V1 + V3
## 
## Fitted party:
## [1] root
## |   [2] V1 <= 50
## |   |   [3] V3 <= 9: 0.000 (n = 46, err = 0.0)
## |   |   [4] V3 > 9: 0.667 (n = 12, err = 2.7)
## |   [5] V1 > 50: 1.000 (n = 42, err = 0.0)
## 
## Number of inner nodes:    2
## Number of terminal nodes: 3

注意ctree() 认为这是一个回归 问题,因为V2 是数字。将V2 编码为factor 可能更合适。然后ctree() 会将其视为分类问题,并选择略有不同的测试统计数据,以及不同的打印和图形显示。

【讨论】:

  • (1) 这是真的,但我不知道如何处理这种嵌套依赖。在我的示例中,V1 是 V2 的“真正”预测器,但 V3 不是,我认为如果我们可以强制分区算法区分两种类型的变量,它可以使分区更有意义(和高效)。但也许 ctree 根本不需要知道哪些变量是“真正的”预测变量,哪些不是表现良好。
  • (2) 你说得对!非常感谢您的热心帮助。
【解决方案2】:

除非我误解了,否则您的代码表明只有当 V1 >50 和 V3 都等于 10 时,您才希望 V2 为 1?

如果是这样,您只需要 ifelse 中的条件 AND 运算符:

V2 <- ifelse(V1 > 50 & V3 == 10, 1, 0)

【讨论】:

  • 对不起,我不是搜索构建 V2 向量而是对其进行分区
  • @MassCorr 您是否希望按照树的建议将 V2 拆分为三个分区?或者你想画一棵树?
  • 我对分区工具感兴趣,而不是绘图工具
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2020-07-21
相关资源
最近更新 更多