r - 如何从回归树中识别每个叶子内的序列?

标签 r decision-tree traminer sequence-analysis

使用biofam数据集

library(TraMineR)
data(biofam)
lab <- c("P","L","M","LM","C","LC","LMC","D")
biofam.seq <- seqdef(biofam[,10:25], states=lab)
head(biofam.seq)

 Sequence                                    
1167 P-P-P-P-P-P-P-P-P-LM-LMC-LMC-LMC-LMC-LMC-LMC
514  P-L-L-L-L-L-L-L-L-L-L-LM-LMC-LMC-LMC-LMC    
1013 P-P-P-P-P-P-P-L-L-L-L-L-LM-LMC-LMC-LMC      
275  P-P-P-P-P-L-L-L-L-L-L-L-L-L-L-L             
2580 P-P-P-P-P-L-L-L-L-L-L-L-L-LMC-LMC-LMC       
773  P-P-P-P-P-P-P-P-P-P-P-P-P-P-P-P 

我可以拟合并显示回归树:

seqt <- seqtree(biofam.seq~sex + birthyr, data=biofam)

seqtreedisplay(seqt, type="I", border=NA, withlegend= TRUE, legend.fontsize=2, legendtext = "Biofam Regression Tree")

然后我可以识别叶成员身份:

seqt$fitted[,1]

然而,这就是我感到困惑的地方。我如何知道哪个叶子编号对应于图中的哪个叶子?该图似乎没有显示它,并且运行 print(seqt) 似乎也没有给出叶子编号。

我想要实现的是分离出每个叶子中的序列,以便我可以单独对每个叶子运行描述。我怎样才能做到这一点?

最佳答案

目前,此信息无法轻松地从树中恢复。以下函数使用树的完整条件而不是节点标签返回拟合值的向量。

dtlabels <- function(tree){
    if (!inherits(tree, "disstree")) {
        stop("tree should be a disstree object")
    }

    split_s <- function(sp){
        formd <- function (x){
            return(format(x, digits =getOption("digits")-2))
        }
        str_split <- character(2)
        vname <- colnames(tree$data)[sp$varindex]
        if (!is.null(sp$breaks)) {
            str_split[1] <- paste("<=", formd(sp$breaks))
            str_split[2] <- paste(">", formd(sp$breaks))
        }
        else {
            str_split[1] <- paste0("[", paste(sp$labels[sp$index==1], collapse=", "),"]")
            str_split[2] <- paste0("[", paste(sp$labels[sp$index==2], collapse=", "),"]")
        }
        if(!is.null(sp$naGroup)){
            str_split[sp$naGroup] <- paste(str_split[sp$naGroup], "with NA")
        }
        return(paste(vname, str_split))
    }
    labelEnv <- new.env()
    labelEnv$label <- list()
    addLabel <- function(n1, n2, val){
        id1 <- as.character(n1$id)
        id2 <- as.character(n2$id)
        labelEnv$label[[id2]] <- c(labelEnv$label[[id1]], val)
    }
    nodeRec <- function(node){
        if(!is.null(node$split)){
            spl <- split_s(node$split)
            addLabel(node, node$kids[[1]], spl[1])
            addLabel(node, node$kids[[2]], spl[2])
            nodeRec(node$kids[[1]])
            nodeRec(node$kids[[2]])
        }
    }
    nodeRec(tree$root)
    l2 <- list()
    for(nn in names(labelEnv$label)){
        l2[[nn]] <- paste0(labelEnv$label[[nn]], collapse=" & ")
    }
    l3 <- as.character(l2)
    names(l3) <- names(l2)
    return(factor(factor(tree$fitted[, 1], levels=as.numeric(names(l3)), labels=l3)))

}

可以通过以下方式使用该函数。

fitted <- dtlabels(seqt)
print(table(fitted))

希望这有帮助!

关于r - 如何从回归树中识别每个叶子内的序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26390837/

相关文章:

WEKA:这些树叶中 '/' 之后的数字代表什么?

r - 在序列中查找特定模式

r - Seqfplot : percentage vs. 最频繁序列的数量?

r - 寻找适用于 CentOS Linux 的 R 4.0.3 编译版本

r - 查找多边形内网格点的坐标

r - R 中一列在另一列的一定范围内的频率

machine-learning - CART 算法 - 为什么对分类变量进行 2^m-1 -1 分割?

r - 如何导出正确的 TSV?

PYTHON 决策树可视化

r - 计算概率后缀树中上下文状态关系的提升?