根据变量名称创建复杂的公式(glmertree)

时间:2018-11-26 10:32:20

标签: r model formula

我正在尝试为混合线性模型树(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(它有3个部分的公式),它不起作用。

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 :(得分:0)

我想我可以回答自己的问题。

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

但这是另一个问题。

答案 1 :(得分:0)

实际上,使用 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校正对于太多变量可能过于保守,因此您不会产生任何分裂。然后,您可以指定bonferroni = FALSE,或将alpha设置为高于默认值.05的值(另请参见?partykit::mob_control)。