gpt4 book ai didi

r - partykit minsize 选项删除超过 minsize 的分支

转载 作者:行者123 更新时间:2023-12-04 11:23:24 25 4
gpt4 key购买 nike

我正在使用 lmtree()来自 partykit 的函数使用线性回归对数据进行分区。回归使用权重,我想确保每个分支都有一个最小总权重,我用 minsize 指定选项。例如,在下面的示例中,树只有两个分支而不是三个,因为 x1=="C"权重太小,无法在其自己的分支中。

n <- 100
X <- rbind(
data.frame(TT=1:n, x1="A", weight=2, y=seq(1,l=n,by=0.2)+rnorm(n,sd=.2)),
data.frame(TT=1:n, x1="B", weight=2, y=seq(1,l=n,by=0.4)+rnorm(n,sd=.2)),
data.frame(TT=1:n, x1="C", weight=1, y=seq(1,l=n,by=0.6)+rnorm(n,sd=.2))
)
X$x1 <- factor(X$x1)
tr <- lmtree(y ~ TT | x1, data=X, weight=weight, minsize=150)

Fitted party:
[1] root
| [2] x1 in A: n = 200
| (Intercept) TT
| 0.7724903 0.2002023
| [3] x1 in B, C: n = 300
| (Intercept) TT
| 0.5759213 0.4659592

我也有一些现实世界的数据,不幸的是,这些数据是 secret 的,但会导致一些我不理解的行为。当我指定minsize时它构建了一棵有 30 个分支的树,其中每个分支的总重量 n是一个很大的数字。但是,当我指定一个 minsize这远低于第一棵树的每个分支的总重量,结果是一棵分支更少的新树。我根本没想到这棵树会发生变化,因为看起来 minsize不具有约束力。这个结果有什么解释吗?

更新

举个例子

n <- 100
X <- rbind(
data.frame(TT=1:n, x1=runif(n, 0.0, 0.3), weight=2, y=seq(1,l=n,by=0.2)+rnorm(n,sd=.2)),
data.frame(TT=1:n, x1=runif(n, 0.3, 0.7), weight=2, y=seq(1,l=n,by=0.4)+rnorm(n,sd=.2)),
data.frame(TT=1:n, x1=runif(n, 0.7, 1.0), weight=1, y=seq(1,l=n,by=0.6)+rnorm(n,sd=.2))
)
tr <- lmtree(y ~ TT | x1, data=X, weights = weight)

Fitted party:
[1] root
| [2] x1 <= 0.29787: n = 200
| (Intercept) TT
| 0.8431985 0.1994021
| [3] x1 > 0.29787
| | [4] x1 <= 0.69515: n = 200
| | (Intercept) TT
| | 0.6346980 0.3995678
| | [5] x1 > 0.69515: n = 100
| | (Intercept) TT
| | 0.4792462 0.5987472

现在让我们设置minsize=150 .即使 x1 <= 0.3 树不再有任何 split 和 x1 > 0.3会工作。

tr <- lmtree(y ~ TT | x1, data=X, weights = weight, minsize=150)

Fitted party:
[1] root: n = 500
(Intercept) TT
0.6870078 0.3593374

最佳答案

mob()(lmtree() 的基础设施)中应用的两条规则在此上下文中很重要,可能会从更明确的讨论中获益:

  • 如果 mob() 在任何阶段选择一个 split 变量,然后不会导致单个可接受的 split (根据最小节点大小),则 split 会在该点停止。这与 ctree() 形成对比,如果检测到重要测试,它总是执行拆分 - 即使次优变量不重要。对此提供更精细的控制可能会很好 - 我们已将其列入我们即将对软件包进行修订的愿望 list 。

  • 默认情况下,weights 被解释为案例权重,即 mob() 认为有 w 个独立观察结果相同到给定的。因此,观察的数量是权重的总和。但请注意,这也会影响样本量增加的显着性检验!

至于您的主要问题:如果没有任何可重现的示例,很难给出解释。我同意 partykit 应该按照您描述的方式运行 - 但也许有一个重要但不是很明显的细节您还没有注意到......如果您能提出来就好了使用可复制问题的小型/简单人工数据集。

更新

正如评论中已经指出的那样:感谢您在更新的问题中提供可重现的示例。这帮助我找到了 mob() 中处理案例权重的错误。在存在案例权重的情况下,检验统计量的计算存在错误,从而导致不正确的拆分变量选择和停止标准。我刚刚修复了这个错误,新的 partykit 开发版本可以从 R-Forge 获得,地址是 https://r-forge.r-project.org/R/?group_id=261 . (但是请注意,R-Forge 目前只为 R 3.3.x 构建 Windows 二进制文件。如果使用更新的 Windows 版本,请使用 type = "source" 安装源包- 并确保您安装了必要的 Rtools。)

在您的示例中,我只是设置了一个随机种子以实现精确的再现性。加权数据设置为:

set.seed(1)
n <- 100
X <- rbind(
data.frame(TT=1:n, x1=runif(n, 0.0, 0.3), weight=2, y=seq(1,l=n,by=0.2)+rnorm(n,sd=.2)),
data.frame(TT=1:n, x1=runif(n, 0.3, 0.7), weight=2, y=seq(1,l=n,by=0.4)+rnorm(n,sd=.2)),
data.frame(TT=1:n, x1=runif(n, 0.7, 1.0), weight=1, y=seq(1,l=n,by=0.6)+rnorm(n,sd=.2))
)

然后可以像以前一样拟合加权树。在此特定示例中,树结构保持不受影响,但每个节点中参数不稳定性测试的测试统计信息和 p 值发生了一些变化:

library("partykit")
tr1 <- lmtree(y ~ TT | x1, data = X, weights = weight)
plot(tr1)

tree1

添加 minsize = 150 参数现在具有避免节点 3 split 的预期效果。

tr2 <- lmtree(y ~ TT | x1, data = X, weights = weight, minsize = 150)
plot(tr2)

tree2

为了检查后者是否确实做了正确的事情,我们将它与明确扩展数据的树进行比较。因此,由于这里的数据被视为案例权重,我们可以通过重复权重大于 1 的那些观察来膨胀数据集。

Xw <- X[rep(1:nrow(X), X$weight), ]
tr3 <- lmtree(y ~ TT | x1, data = Xw, minsize = 150)

结果系数相同(直到非常小的数值差异):

all.equal(coef(tr2), coef(tr3))
## [1] TRUE

而且,更重要的是,节点中的所有测试统计信息和 p 值也相同:

library("strucchange")
all.equal(sctest(tr2), sctest(tr3))
## [1] TRUE

关于r - partykit minsize 选项删除超过 minsize 的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45311767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com