微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 mob() 树partykit 包和逻辑模型

如何解决使用 mob() 树partykit 包和逻辑模型

我正在尝试使用基于模型的递归分区 (MOB) 和 mob() 函数(来自 partykit 包)来获取与每个特征相关联的不同参数,具体取决于使用 Logistic() 回归找到的最佳分区(glm-binomial) 函数。我必须定义我的模型。

按照第 7 页上的这个示例:https://cran.r-project.org/web/packages/partykit/vignettes/mob.pdf 我创建了一个 logit 函数,用于估计值并返回logistic() 函数的估计值等。 然而,函数的定义似乎并不正确。

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

有什么线索吗?

谢谢:)

解决方法

显然,问题与 formula 中的选项 partykit::mob 有关。我不知道您想到的是哪种模型,但是您没有指定任何分区变量 (Z)。以下工作,但没有发现任何中断。我认为这是因为数据集太小了。

拟合模型假设您正在拟合一个模型,其中 HHk 是您的回归量,而 HHd 被用作分区变量。

p <- mob(formula = future ~ HHk  | HHd,data=sample,fit = logit_func)

# Model-based recursive partitioning (logit_func)
# 
# Model formula:
#   future ~ HHk | HHd
# 
# Fitted party:
#   [1] root: n = 10
# x(Intercept)         xHHk 
# -1.386266     2.006611  
# 
# Number of inner nodes:    0
# Number of terminal nodes: 1
# Number of parameters per node: 2
# Objective function: 6.557608
,

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

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

  1. if(is.null(x)) 中捕获 case logit_func(),然后使用 glm(y ~ 1,...)

  2. 保持 logit_func() 不变,并明确指定截距的回归:mob(future ~ 1 | .,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 ~ .,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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。