создать сложную формулу (glmertree) из имен переменных - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь создать формулу для дерева смешанных линейных моделей (glmertree).

X<-data.frame(matrix(runif(100*5),100,5))
y<-rnorm(X[,1]+X[,2],1)
site<-rep(1:2,c(50,50))
X<-data.frame(y,site,X)

Для rpart это будет работать

library(rpart)
f1<-formula(paste(names(X)[1],paste(names(X)[-c(1:2)] , 
collapse=" + "),sep=" ~ "))
rpart(f1,data=X)

, но для glmertree, у которого есть формулав трех частях это не работает.

lt <- lmertree(y~ 0| site | paste(names(X)[-c(1:2)],collapse=" + "),data=X)
 Error in model.frame.default(terms(formula, lhs = lhs, rhs = rhs, 
  data = data,  : variable lengths differ (found for 'paste(names(X)[

lt <- lmertree(y~ 0| site | formula(paste(names(X)[-c(1:2)],collapse=" + ")),data=X)
Error in eval(parse(text = x, keep.source = FALSE)[[1L]]) : 
     object 'X1' not found

Это будет работать

lt <- lmertree(y~ 0| site | X1 + X2 + X3 + X4 + X5 ,data=X)

однако в реальных данных у меня будут тысячи переменных.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Действительно, указание многих переменных ответа немного сложнее с glmertree , потому что использование точки (например, y ~ 1 | site | .) создаст проблемы при итеративной оценке (попытка улучшить это в следующей версиииз glmertree ).

Кажется, нет необходимости пропускать перехват в линейной модели в терминальном узле (т. е. с ~ 0 в формуле), я бы всегда советовалчтобы включить его (в противном случае проверка стабильности параметров, вероятно, не проверяет то, что вы хотите, чтобы они тестировали).

Я считаю, что ваш код можно немного упростить:

f1 <- formula(paste("y ~ 1 | site |", paste(names(X)[-(1:2)] , collapse="+")))
lt <- lmertree(f1, data=X)

С 16000 предикторомпеременные, вещи станут вычислительно тяжелыми, хотя.Если значение слишком велико, может помочь ограничение размера дерева по спецификации аргумента maxdepth.Или поправка Бонферрони для множественного тестирования в тестах стабильности параметров может быть слишком консервативной с таким большим количеством переменных, поэтому вы не получите разбиений.Затем вы можете указать bonferroni = FALSE или установить alpha на значение выше значения по умолчанию .05 (см. Также ?partykit::mob_control).

0 голосов
/ 27 ноября 2018

Я думаю, что могу ответить на свой собственный вопрос.

f1<-formula(
   paste(names(X)[1],
                  paste("0",paste(names(X)[2]),
                      paste(names(X)[-c(1:2)] , collapse=" + "),
                        sep="|"),
                 sep=" ~ ")
           )
f1
y ~ 0 | site | X1 + X2 + X3 + X4 + X5
lt <- lmertree(f1,data=X)

Это работает примерно для 16000 переменных, затем оно переходит к

Error: protect(): protection stack overflow

, но это еще одна проблема.

...