我正在尝试为混合线性模型树(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)
但是,我将在真实数据中包含数千个变量。
答案 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
)。