首页 > 解决方案 > 将 mob() 树(partykit 包)与logistic() 模型一起使用

问题描述

我正在尝试将基于模型的递归分区 (MOB) 与 mob() 函数(来自partykit 包)一起使用,以根据使用逻辑回归(glm-二项式)函数。我必须定义我的模型。

按照第 7 页上的示例:https ://cran.r-project.org/web/packages/partykit/vignettes/mob.pdf我创建了一个 logit 函数来估计值并返回逻辑的估计值等( ) 功能。但是,函数的定义似乎并不正确。

library(partykit)
logit_func <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) {
  glm(y ~ 0 + x, family = binomial, start = start, ...)
}

p <- mob(future~., data=sample, fit = logit_func)

...并得到以下错误

Error in model.frame.default(formula = y ~ 0 + x, drop.unused.levels = TRUE) : 
  invalid type (NULL) for variable 'x' 

示例数据框如下:

sample <- structure(list(future = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L), .Label = c("0", "1"), class = "factor"), HHk = c(0.412585987717856, 
1, 1, 1, 1, 1, 1, 1, 0.865684350743137, 0.685221125225357), HHd = c(0.529970735028671, 
1, 1, 1, 0.611295754192343, 0.171910197073699, 0.722887386610618, 
0.457585763978574, 0.517888089662373, 0.401285262785306), via_4 = structure(c(1L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("0", "1"), class = "factor"), 
    region_5 = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L), .Label = c("0", "1"), class = "factor")), row.names = c(NA, 
10L), class = "data.frame")

有什么线索吗?

谢谢 :)

标签: rmachine-learningtreeregressionparty

解决方案


在您的mob()通话中,您formula只有一个 type 右侧y ~ z- 而不是 type 右侧有一个两部分模型y ~ x | zz变量是用于树中拆分/分区的变量,x变量是模型中用作回归量的变量。(正如 Álvaro 在回复中已经指出的那样。)

原则上,没有任何回归器是可以的,您可以简单地使用常量拟合(即,仅截距模型)。但是,logit_func()您定义的并没有捕捉到这种情况。有三种方法可以解决这个问题:

  1. 抓住盒子if(is.null(x))里面logit_func()然后使用glm(y ~ 1, ...)

  2. 保持logit_func()原样,并明确指定截距的回归:mob(future ~ 1 | ., data=sample, fit = logit_func).

  3. 使用专用glmtree()功能而不是一般mob()加手工制作logit_func()glmtree(future ~ ., data = sample, family = binomial)

所有这三个都将导致相同的树,但出于多种原因强烈首选策略 3: (a) 它很容易获得,并且不需要创建自定义代码。(b) 内部使用的拟合函数在计算上更有效(例如,避免重复的公式解析等)。(c) 结果树有更好的方法可用,例如,方法中有更好plot()和更多的选项predict()

此外,将一些解释变量视为回归变量而将其他解释变量视为分裂变量可能是有意义的(正如 Álvaro 所建议的那样)。但这取决于数据和应用案例,如果没有进一步的背景,很难提出建议。

您的sample数据结果如下所示。当然,在这个小数据集上没有发现分裂,但在完整的数据集上,它应该可以按预期工作。

p <- glmtree(future ~ ., data = sample, family = binomial)
p
## Generalized linear model tree (family: binomial)
## 
## Model formula:
## future ~ 1 | .
## 
## Fitted party:
## [1] root: n = 10
##     (Intercept) 
##       0.4054651  
## 
## Number of inner nodes:    0
## Number of terminal nodes: 1
## Number of parameters per node: 1
## Objective function (negative log-likelihood): 6.730117

推荐阅读