R 基于模型的分区;“两层互动”;(分段模型)
我正在尝试构建一个基于模型的树,它具有“两层交互”的类型,其中树节点中的模型再次被分割 为此,我使用了R 基于模型的分区;“两层互动”;(分段模型),r,tree,partitioning,party,R,Tree,Partitioning,Party,我正在尝试构建一个基于模型的树,它具有“两层交互”的类型,其中树节点中的模型再次被分割 为此,我使用了mob()函数,但我无法使fit函数的参数与lmtree()函数一起工作 在下面的示例中,a是b的函数,a和b之间的关系取决于d和b | d library("partykit") set.seed(321) b <- runif(200) d <- sample(1:2, 200, replace = TRUE) a <- jitter(ifelse(d == 1, 2 *
mob()
函数,但我无法使fit
函数的参数与lmtree()
函数一起工作
在下面的示例中,a
是b
的函数,a
和b
之间的关系取决于d
和b | d
library("partykit")
set.seed(321)
b <- runif(200)
d <- sample(1:2, 200, replace = TRUE)
a <- jitter(ifelse(d == 1, 2 * b - 1, 4 * b - 1.2), amount = .1)
a[b < .5 & d == 1] <- jitter(rep(0, length(a[b < .5 & d == 1])))
a[b < .3 & d == 2] <- jitter(rep(0, length(a[b < .3 & d == 2])))
fit <- function(y, x, start = NULL, weights = NULL, offset = NULL, ..., estfun = FALSE, object = FALSE)
{
x <- x[, 2]
l <- lmtree(y ~ x | b)
return(l)
}
m <- mob(a ~ b | d, fit = fit) # not working
library(“partykit”)
种子集(321)
b没有,但有;-)
不,lmtree()
不能轻松用作mob()的装配工
内部树(lmtree()
)的维度是不固定的,也就是说,您可能会得到一个没有任何分区或有许多子组的树,这将使外部树(mob()
)感到困惑
即使人们解决了维度问题,或通过总是强制一次中断来解决它,也需要更多的工作来设置正确的系数向量、估计函数矩阵等。这也不是很简单,因为如果给定断点(例如,对于二元因子),收敛速度(以及由此产生的推断)是不同的或者必须进行估计(例如对于数值变量b
)
按照设置fit()
函数的方式,内部lmtree()
不知道在哪里可以找到b
。它只有一个数值向量y
和一个数值矩阵x
,而不是原始数据
但是是的,如果将视图从拟合“两层”树更改为拟合树中的“分段”模型,我认为所有这些问题都可以解决。我的印象是,您希望拟合一个模型y~x
(或您的示例中的a~b
),其中分段线性函数与x
中的附加断点一起使用。如果分段线性函数假定在x
中是连续的,那么分段的
包可以很容易地使用。如果没有,则可以利用strucchange
。假设您想要前者(因为您已经模拟了这样的数据),我将在下面包含一个经过处理的分段的示例(还稍微修改了您的问题以反映这一点)
稍微更改名称和代码,您的数据d
具有分段分段线性关系y~x
,系数取决于组变量g
set.seed(321)
d <- data.frame(
x = runif(200),
g = factor(sample(1:2, 200, replace = TRUE))
)
d$y <- jitter(ifelse(d$g == "1",
pmax(0, 2 * d$x - 1),
pmax(0, 4 * d$x - 1.2)
), amount = 0.1)
(注意:我没有尝试过segmented()
是否也支持lm()
具有权重和偏移量的对象)
在这个基本示例中,我们可以得到在g
中简单拆分的完整树:
library("partykit")
segtree <- mob(y ~ x | g, data = d, fit = segfit)
plot(segtree, terminal_panel = node_bivplot, tnex = 2)
library(“partykit”)
塞格特里:谢谢:-)我真的很惊讶把这些放在一起是多么容易!但是维托的分段的足够友好,可以提供我们所需的所有构建块。现在我很想看看它在真实数据中的效果如何……谢谢@AchimZeileis。实际上,我一开始正是使用了这种方法(分段函数拟合)。但我放弃了我的真实数据,因为它需要几天才能运行。。。无论如何,再次感谢您的帮助。@MassCorr对于mob(y~x |…,fit=segtree)
而言,与lmtree(y~x |…)
相比,计时问题是不是非常不同?如果后者也需要很长时间,那么可能需要粗化一些回归系数或因子,以减轻分割点搜索、增加最小分段大小、限制树深度等。我知道@AchimZeileis mob+segmented比lmtreeOk花费更多的时间。大约多少钱?可能有人可以玩弄起始值等。可能有些加速是可能的。询问维托也可能有帮助。。。
library("partykit")
segtree <- mob(y ~ x | g, data = d, fit = segfit)
plot(segtree, terminal_panel = node_bivplot, tnex = 2)