factors/characters 问题的递归划分

Recursive partitioning for factors/characters problem

目前我正在处理数据集predictions。在此数据中,我已将清晰的字符类型变量转换为因子,因为我认为因子比 glmtree() 代码中的字符更有效(如果我对此有误,请告诉我):

> str(predictions)
'data.frame':   43804 obs. of  14 variables:
$ month        : Factor w/ 7 levels "01","02","03",..: 6 6 6 6 1 1 2 2 3 3 ...
$ pred         : num  0.21 0.269 0.806 0.945 0.954 ...
$ treatment    : Factor w/ 2 levels "0","1": 1 1 2 2 2 2 2 2 2 2 ...
$ type         : Factor w/ 4 levels "S","MS","ML",..: 1 1 4 4 4 4 4 4 4 4 ...
$ i_mode     : Factor w/ 143 levels "AAA","ABC","CBB",..: 28 28 104 104 104 104 104 104 104 104 ...
$ r_mode  : Factor w/ 29 levels "0","5","8","11",..: 4 4 2 2 2 2 2 2 2 2 ...
$ in_mode: Factor w/ 22 levels "XY",..: 11 11 6 6 6 6 6 6 6 6 ...
$ v_mode     : Factor w/ 5 levels "1","3","4","7",..: 1 1 1 1 1 1 1 1 1 1 ...
$ di        : num  1157 1157 1945 1945 1945 ...
$ cont    : Factor w/ 5 levels "AN","BE",..: 2 2 2 2 2 2 2 2 2 2 ...
$ hk          : num  0.512 0.512 0.977 0.977 0.941 ...
$ np           : num  2 2 2 2 2 2 2 2 2 2 ...
$ hd          : num  1 1 0.408 0.408 0.504 ...
$ nd           : num  1 1 9 9 9 9 7 7 9 9 ...

我想估计这种递归划分模型:

library("partykit")
glmtr <- glmtree(formula = pred ~ treatment + 1 | (month+type+i_mode+r_mode+in_mode+v_mode+di+cont+np+nd+hd+hk),   
                 data = predictions, 
                 maxdepth=6,
                 family = quasibinomial)

我的数据没有任何NA。但是,出现以下错误(即使按因子更改字符后):

Error in matrix(0, nrow = mi, ncol = nl) : 
  invalid 'nrow' value (too large or NA)
In addition: Warning message:
  In matrix(0, nrow = mi, ncol = nl) :
  NAs introduced by coercion to integer range

有线索吗?

谢谢

你是对的,glmtree() 和基础 mob() 函数期望分割变量是名义信息情况下的因素。但是,从计算上讲,这仅适用于水平数量有限的因素,因为该算法将尝试将所有可能的水平数量划分为两组。因此,对于您的 i_mode 因素,这需要通过 nl 级别,并且 mi 分成两组:

nl <- 143
mi <- 2^(nl - 1L) - 1L
mi
## [1] 5.575186e+42

在内部,mob() 尝试创建一个矩阵来存储与相应分区模型关联的所有对数似然。这是不可能的,因为无法表示这样的矩阵。 (即使可以,也不会完成所有关联模型的拟合。)不可否认,错误消息不是很有用,应该加以改进。我们将在软件包的下一次修订中对此进行研究。

为了解决这个问题,我建议将变量i_moder_modein_mode变成更适合穷举搜索二分法的变量。也许,有些变量实际上是有序的?如果是这样,我建议将它们转换为序数因子,或者在 i_mode 的情况下甚至转换为数字变量,因为级别数足够大。或者,您可以创建几个具有关于不同级别的不同属性的因子,然后可以将其用于分区。