Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于模型的分区;“两层互动”;(分段模型)_R_Tree_Partitioning_Party - Fatal编程技术网

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)