问题描述
我正在尝试使用基于模型的递归分区 (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 | z
。 z
变量是用于在树中进行拆分/分区的变量,x
变量是用作模型中回归量的变量。 (正如 Álvaro 在回复中已经指出的那样。)
原则上,没有任何回归量是可以的,您可以简单地使用常数拟合(即仅截距模型)。但是,您定义的 logit_func()
没有捕捉到这种情况。有三种方法可以解决这个问题:
-
在
if(is.null(x))
中捕获 caselogit_func()
,然后使用glm(y ~ 1,...)
。 -
保持
logit_func()
不变,并明确指定截距的回归:mob(future ~ 1 | .,fit = logit_func)
。 -
使用专用的
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