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_mode
、r_mode
和in_mode
变成更适合穷举搜索二分法的变量。也许,有些变量实际上是有序的?如果是这样,我建议将它们转换为序数因子,或者在 i_mode
的情况下甚至转换为数字变量,因为级别数足够大。或者,您可以创建几个具有关于不同级别的不同属性的因子,然后可以将其用于分区。
目前我正在处理数据集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_mode
、r_mode
和in_mode
变成更适合穷举搜索二分法的变量。也许,有些变量实际上是有序的?如果是这样,我建议将它们转换为序数因子,或者在 i_mode
的情况下甚至转换为数字变量,因为级别数足够大。或者,您可以创建几个具有关于不同级别的不同属性的因子,然后可以将其用于分区。