CART中的交互

时间:2014-08-19 18:22:25

标签: r tree rpart

我正在尝试使用Rpart将决策树制成表格。我正在使用的代码如下,因此可以复制粘贴。

ss <- 100
set.seed(123)
x1 <- relevel(as.factor(sample(1:4,ss, replace=TRUE)), ref="4")
x11 <- ifelse(x1==1,1,0)
x12 <- ifelse(x1==2,1,0)
x13 <- ifelse(x1==3,1,0)
x2 <- relevel(as.factor(sample(1:3,ss, replace=TRUE)), ref="3")
x21 <- ifelse(x2==1,1,0)
x22 <- ifelse(x2==2,1,0)
x3 <- relevel(as.factor(sample(1:2,ss, replace=TRUE)), ref="2")
x31<- ifelse(x3==1,1,0)
y <- relevel(as.factor(sample(1:2,ss, replace=TRUE)), ref="2")
y1 <- ifelse(y==1,1,0)

n1  <- relevel(as.factor(sample(1:4,ss, replace=TRUE)), ref="4")
n11 <- ifelse(n1==1,1,0)
n12 <- ifelse(n1==2,1,0)
n13 <- ifelse(n1==3,1,0)
n2 <- relevel(as.factor(sample(1:3,ss, replace=TRUE)), ref="3")
n21  <- ifelse(n2==1,1,0)
n22 <- ifelse(n2==2,1,0)
n3 <- relevel(as.factor(sample(1:2,ss, replace=TRUE)), ref="2")
n31<- ifelse(n3==1,1,0)

xbeta <- -0.667-0.167*x11 + 0.167*x12 + 0.333*x13 + x21 -1.333*x22+ x31 + 0.667*y1 +0*n11+0*n12+0*n13+ 0*n21 + 0*n22 + 0*n31 - 1.333*y1*x21+ y1*x22 -1.333*y1*x31
p <- exp(xbeta)/(1+exp(xbeta))
R<- rbinom(ss,1,p)

fit <- rpart(R ~ x1+x2+x3+n1+n2+n3+y, method="class")

然后查看绘制的树,我正在使用

plot(fit, uniform=TRUE, main="Classification Tree")
text(fit, use.n=TRUE, all=TRUE, cex=.8)

此外,在我的代码中,所有这些都在for循环中,因为我正在模拟100个这样的数据集。为简单起见,未包含所有内容。

当你输入printcp(fit)时,我知道如何提取“树构造中实际使用的变量”并将它们制成表格,以便计算每个变量被选中的次数。现在,问题是,我希望捕获x2和y以及x3和y之间的潜在交互,当然,还要列出这些交互出现的次数。现在,为此,基本上,当人们看到树的图表(使用plot(fit))时,每次y是x2或x3的IMMEDIATE子分支时,我想以某种方式创建一个跟踪的向量那。我说直接子分支,因为如果假设,x2被细分为n3然后n3分支成y,那么不,我不会将其视为x2和y的双向交互。但是,如果x2分支为y,那么是的,我想将其视为x2和y之间的双向交互。

我尝试使用path.rpart但这似乎没有帮助跟踪x2或x3是否立即分支到y。然后,我想列出x2 * y交互的频率以及x3 * y交互的频率。

1 个答案:

答案 0 :(得分:0)

这是一个可以从分类树中提取父/子对的函数。

getparentchildpairs<-function(fit) {
    varnodes <- subset(fit$frame, var != "<leaf>", select="var")
    varnodes$var <- as.character(varnodes$var)
    cp<-Map(function(a,b) {varnodes$var[rownames(varnodes) %in% c(2*b, 2*b+1)]}, 
        varnodes$var, as.numeric(rownames(varnodes)))
    setNames(stack(Filter(length, cp)), c("child","parent"))
}

你可以通过传递契合来使用它

fit <- rpart(R ~ x1+x2+x3+n1+n2+n3+y, method="class")
getparentchildpairs(fit)

#   child parent
# 1    x3     x2
# 2    x1     x3
# 3    n1     x1

如果您愿意,可以将这些对解释为“互动”。

enter image description here