条件分区
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) 你所描述的情况是回归变量 V1
和 V3
之间的依赖关系。这与 V2
不同,具体取决于 V1
和 V3
之间的交互。你显示的树结构对应的是后者,不是前者。
(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()
结果。它确实发现了 V1
和 V3
之间的相互作用,尽管在 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()
会将其视为 分类 问题并选择略有不同的测试统计数据,以及不同的打印和图形显示。
我想使用变量 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) 你所描述的情况是回归变量 V1
和 V3
之间的依赖关系。这与 V2
不同,具体取决于 V1
和 V3
之间的交互。你显示的树结构对应的是后者,不是前者。
(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()
结果。它确实发现了 V1
和 V3
之间的相互作用,尽管在 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()
会将其视为 分类 问题并选择略有不同的测试统计数据,以及不同的打印和图形显示。