这篇文章遵循这个问题:https : //stackoverflow.com/questions/31234329/rpart-user-defined-implementation
我对可以使用自定义标准处理树木生长的工具非常感兴趣,这样我就可以测试不同的模型。
我尝试使用partykit R包来生长一棵树,其分裂规则由Cox模型的负对数似然给出(在Cox模型的情况下为对数准似然)并拟合Cox模型在每一片叶子里。
正如我在阅读有关 MOB 函数的小插图时所理解的,有两种方法可以实现我自己的拆分标准,即让 fit 函数返回列表或模型对象。
出于我的目的,我尝试了这两种解决方案,但未能使其发挥作用。
解决方案 1:返回一个列表对象:
我以“mob”小插图中的“乳腺癌数据集”为例。
我试过这个:
cox1 = function(y,x, start = NULL, weights = NULL, offset = NULL, ...,
estfun = FALSE, object = TRUE){
res_cox = coxph(formula = y ~ x )
list(
coefficients = res_cox$coefficients,
objfun = - res_cox$loglik[2],
object = res_cox)
}
mob(formula = Surv(time, cens) ~ horTh + pnodes - 1 | age + tsize + tgrade + progrec +
estrec + menostat ,
data …Run Code Online (Sandbox Code Playgroud) 当从 partykit 绘制ctree模型时,我知道它选择默认值是为了防止过度拟合过度生长的树木。此默认值有时会导致树过于简单。为了使用后修剪技术,我想使用 ctree 制作一棵过度拟合的树,可能已经完全生长,然后进行修剪。尝试很多不同的事情,但我的代码出现错误。
关于使用所有变量来创建树的堆栈溢出答案不是我想要的。我不一定想要所有变量,但我希望树的最大深度尽可能地杂草丛生。
基本上,如何让树的深度尽可能深?
请参阅下面的代码和输出:
treemodel <- ctree(Species ~ ., iris)
plot(treemodel)
Run Code Online (Sandbox Code Playgroud)
我使用包中的帮助+文档,但没有看到很多自定义选项。有希望的一个是控制参数,但文档不是很详细。通过在其他论坛上搜索,我尝试了以下方法:
treemodel <- ctree(Species ~ ., iris, control=mincriterion)
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
treemodel <- ctree(Species ~ ., iris, control="mincriterion")
Run Code Online (Sandbox Code Playgroud)
但这两个代码都会引发错误。错误:
if (sum(weights) < ctrl$minsplit) return(partynode(as.integer(id))) 中出错:参数长度为零
我在 mac os 上使用 partykit 1.1-1 和 r。
我正在使用ctree并且我的数据集具有创建节点的协变量。该协变量有足够多的因子,并且它们的名称足够长,以至于它们在节点处创建的边中彼此重叠。我想找到一种方法来阻止这种重叠。
我检查了其他问题并找到了一个可以提供一些帮助的答案。的情节ctree依赖于grid包,我可以使用函数在边缘写新标签。我现在的问题是我不知道如何抑制plot树时默认打印的标签。我不太了解grid或plot.party弄清楚需要抑制哪个对象。
libary(partykit)
library(tidyverse) #this is here for the mpg data set in next line. not required for partykit
data(mpg)
irt <- ctree(hwy~as.factor(class),data=mpg)
plot(irt)
Run Code Online (Sandbox Code Playgroud)
生成的第一个节点的一条边带有“2seater、compact、midsize、subcompact”,另一条边带有“minivan、pickup、suv”。我最终在情节中看到的是“2seater,紧凑型,中型,subcompaminivan,皮卡,sub”。我已经使图形设备全屏显示。(我还有其他只有一个节点的树,因此在全屏尺寸下这些树看起来很奇怪,所以我不想来回走动。)
我的部分解决方案是
plot(irt, pop=FALSE)
seekViewport("edge1-1")
grid.text("2seater, compact,\n midsize, subcompact")
Run Code Online (Sandbox Code Playgroud)
这将“2seater, compact”叠加在“中型、超小型”之上,并防止它们重叠“小型货车、皮卡、SUV”。但是现在,我在情节中仍然有原来的太长标签。我正在尝试修复的标签所附的边缘在一个与新堆叠标签不兼容的地方有一个中断。修复那个边缘会很好,但真正的问题是抑制 edge1-1 上的原始标签太长。
我使用ctree创建了一个二叉分类树.我希望每个终端节点包含与该节点关联的行名称.我怎么能做到这一点?
例如,对于下面的数据集,我希望最左边的节点列出所有年龄<23岁(Abner到Abudemio)和最右边的Abundiantus到Acelin的人的名字.
names age height young
1 Abner 18 76.1 yes
2 Abraham 19 77.0 yes
3 Abram 20 78.1 yes
4 Abrasha 21 78.2 yes
5 Absalom 22 78.8 yes
6 Abudemio 23 79.7 yes
7 Abundiantus 24 79.9 no
8 Acacio 25 81.1 no
9 Acario 26 81.2 no
10 Accursius 27 81.8 no
11 Ace 28 82.8 no
12 Acelin 29 83.5 no
Run Code Online (Sandbox Code Playgroud)
.
我party在R中使用包
我想从结果树的各个节点获得各种统计数据(平均值,中位数等),但我看不出如何做到这一点.例如
airq <- subset(airquality, !is.na(Ozone))
airct <- ctree(Ozone ~ ., data = airq,
controls = ctree_control(maxsurrogate = 3))
airct
plot(airct)
Run Code Online (Sandbox Code Playgroud)
导致具有4个终端节点的树.如何获得每个节点的平均空气质量?
我想在这里应用决策树.决策树负责在每个节点本身进行拆分.但在第一个节点我想根据"年龄"分割我的树.我该怎么强迫呢?
library(party)
fit2 <- ctree(Churn ~ Gender + Age + LastTransaction + Payment.Method + spend + marStat, data = tsdata)
Run Code Online (Sandbox Code Playgroud) 我有一个使用分析的分类树ctree(),想知道如何旋转终端节点以使轴垂直?
library(party)
data(iris)
attach(iris)
plot(ctree(Species ~ Sepal.Length + Sepel.Width
+ Petal.Length + Petal.Width, data = iris))
Run Code Online (Sandbox Code Playgroud) 我有一个包含6个分类变量的数据集,其级别从5到28.我从ctree()(聚会包)获得了17个终端节点的输出.我跟随了来自ctree()的@Galled的输入- 如何获取每个终端节点的拆分条件列表?达到我想要的输出.
但是,运行代码后出现以下错误:
Error in data.frame(ResulTable, Means, Counts) :
arguments imply differing number of rows: 17, 2
Run Code Online (Sandbox Code Playgroud)
我试过添加这些额外的行:
ResulTable <- rbind(ResulTable, cbind(Node = Node, Path = Path2))
ResulTable$Node <- rownames(ResulTable)
melt(ResulTable)
Run Code Online (Sandbox Code Playgroud)
但到目前为止没有成功.有关它出错的地方的任何指示?
我需要将条件推理树(在R的方库中绘制)插入到博士论文中,这就是我必须调整所有图形参数的原因.
我知道最佳宽度是700(只是因为它符合最佳论文的格式).问题在于,在这种情况下,人们无法看到导致树的较低级别中的一个或两个节点的因素列表.
我试图在绘图时指定cex参数,但它没有给我带来任何影响.我需要降低图中的标签尺寸.我会感激任何帮助.
代码如下所示:
blgrcit <- ctree(Suffix ~ cluster + quality + declination, blgr)
jpeg("bulgarian_tree.jpeg", width = 700)
plot(blgrcit, cex = 0.4)
dev.off()
Run Code Online (Sandbox Code Playgroud) 嗨我正在尝试使用partykit中的ctree来提取存储在R中的常量派对对象中的一些内部节点信息,但我发现导航对象有点困难,我能够在绘图上显示信息但是我不确定如何提取信息 - 我认为它需要nodeapply或partykit中的其他功能?
library(partykit)
irisct <- ctree(Species ~ .,data = iris)
plot(irisct, inner_panel = node_barplot(irisct))
Run Code Online (Sandbox Code Playgroud)
绘制的函数可以访问所有信息,但我的文本输出类似于: 示例输出