条件分区

Conditional partitioning

我想使用变量 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 没有给出最佳分类(见上文)。

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

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

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

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

我仍然没有完全理解你问题的要点,因此可能没有完整的答案。但我可以发表几点意见:

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

(2) 您显示的树不是 "optimal" 因为 - 由于 (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() 会将其视为 分类 问题并选择略有不同的测试统计数据,以及不同的打印和图形显示。