Рекурсивное разбиение для проблемы факторов/символов

В настоящее время я работаю с набором данных 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

Любая подсказка?

Спасибо


person vog    schedule 12.02.2021    source источник


Ответы (1)


Вы правы в том, что 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, даже в числовую переменную, потому что количество уровней достаточно велико. В качестве альтернативы вы можете создать несколько факторов с разными свойствами для разных уровней, которые затем можно использовать для разделения.

person Achim Zeileis    schedule 14.02.2021
comment
Спасибо, Ахим! Я обнаружил, что для коэффициента с прибл. 30 уровней модель проходит без проблем. Как бы вы поступили с представлением дерева, если у вас много уровней? В моем случае это даже не читается. Есть ли способ сделать его более наглядным? - person vog; 14.02.2021
comment