Error: requires numeric/complex matrix/vector arguments for %*%; cross validating glmmTMB model
Error: requires numeric/complex matrix/vector arguments for %*%; cross validating glmmTMB model
我正在将一些为 glmer/merMod
模型编写的 k 折交叉验证代码改编为 glmmTMB
模型框架。一切似乎都很好,直到我尝试使用模型的输出与训练数据相匹配来预测值并将其指数化到矩阵中(然后分成 quantiles/number 个箱子以评估预测性能)。我可以使用 glmer 模型使这条线工作,但似乎当我 运行 使用 glmmTMB 的相同模型时我得到 Error in model.matrix: requires numeric/complex matrix/vector arguments
还有很多其他帖子讨论这个错误代码,我已经尝试转换将数据框转换为矩阵形式并更改协变量的 class 没有运气。分别 运行 宁 %*%
之前和之后的部分工作但是当组合时我得到错误。对于上下文,此代码旨在 运行 和 use/availability 数据,因此示例变量可能没有意义,但问题已得到充分说明。关于发生的事情有什么建议吗?
library(lme4)
library(glmmTMB)
# Example with mtcars dataset
data(mtcars)
# Model both with glmmTMB and lme4
m1 <- glmmTMB(am ~ mpg + wt + (1|carb), family = poisson, data=mtcars)
m2 <- glmer(am ~ mpg + wt + (1|carb), family = poisson, data=mtcars)
#--- K-fold code (hashed out sections are original glmer version of code where different)---
# define variables
k <- 5
mod <- m1 #m2
dt <- model.frame(mod) #data used
reg.list <- list() # initialize object to store all models used for cross validation
# finds the name of the response variable in the model dataframe
resp <- as.character(attr(terms(mod), "variables"))[attr(terms(mod), "response") + 1]
# define column called sets and populates it with character "train"
dt$sets <- "train"
# randomly selects a proportion of the "used"/am records (i.e. am = 1) for testing data
dt$sets[sample(which(dt[, resp] == 1), sum(dt[, resp] == 1)/k)] <- "test"
# updates the original model using only the subset of "trained" data
reg <- glmmTMB(formula(mod), data = subset(dt, sets == "train"), family=poisson,
control = glmmTMBControl(optimizer = optim, optArgs=list(method="BFGS")))
#reg <- glmer(formula(mod), data = subset(dt, sets == "train"), family=poisson,
# control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
reg.list[[i]] <- reg # store models
# uses new model created with training data (i.e. reg) to predict and exponentiate values
predall <- exp(as.numeric(model.matrix(terms(reg), dt) %*% glmmTMB::fixef(reg)))
#predall <- exp(as.numeric(model.matrix(terms(reg), dt) %*% lme4::fixef(reg)))
无需仔细查看代码:glmmTMB::fixef(reg)
returns a list(包含元素 cond
(条件模型参数),zi
(零-inflation 参数),disp
(色散参数)而不是向量。
如果您将此位替换为 glmmTMB::fixef(reg)[["cond"]]
,它可能会起作用。
我正在将一些为 glmer/merMod
模型编写的 k 折交叉验证代码改编为 glmmTMB
模型框架。一切似乎都很好,直到我尝试使用模型的输出与训练数据相匹配来预测值并将其指数化到矩阵中(然后分成 quantiles/number 个箱子以评估预测性能)。我可以使用 glmer 模型使这条线工作,但似乎当我 运行 使用 glmmTMB 的相同模型时我得到 Error in model.matrix: requires numeric/complex matrix/vector arguments
还有很多其他帖子讨论这个错误代码,我已经尝试转换将数据框转换为矩阵形式并更改协变量的 class 没有运气。分别 运行 宁 %*%
之前和之后的部分工作但是当组合时我得到错误。对于上下文,此代码旨在 运行 和 use/availability 数据,因此示例变量可能没有意义,但问题已得到充分说明。关于发生的事情有什么建议吗?
library(lme4)
library(glmmTMB)
# Example with mtcars dataset
data(mtcars)
# Model both with glmmTMB and lme4
m1 <- glmmTMB(am ~ mpg + wt + (1|carb), family = poisson, data=mtcars)
m2 <- glmer(am ~ mpg + wt + (1|carb), family = poisson, data=mtcars)
#--- K-fold code (hashed out sections are original glmer version of code where different)---
# define variables
k <- 5
mod <- m1 #m2
dt <- model.frame(mod) #data used
reg.list <- list() # initialize object to store all models used for cross validation
# finds the name of the response variable in the model dataframe
resp <- as.character(attr(terms(mod), "variables"))[attr(terms(mod), "response") + 1]
# define column called sets and populates it with character "train"
dt$sets <- "train"
# randomly selects a proportion of the "used"/am records (i.e. am = 1) for testing data
dt$sets[sample(which(dt[, resp] == 1), sum(dt[, resp] == 1)/k)] <- "test"
# updates the original model using only the subset of "trained" data
reg <- glmmTMB(formula(mod), data = subset(dt, sets == "train"), family=poisson,
control = glmmTMBControl(optimizer = optim, optArgs=list(method="BFGS")))
#reg <- glmer(formula(mod), data = subset(dt, sets == "train"), family=poisson,
# control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
reg.list[[i]] <- reg # store models
# uses new model created with training data (i.e. reg) to predict and exponentiate values
predall <- exp(as.numeric(model.matrix(terms(reg), dt) %*% glmmTMB::fixef(reg)))
#predall <- exp(as.numeric(model.matrix(terms(reg), dt) %*% lme4::fixef(reg)))
无需仔细查看代码:glmmTMB::fixef(reg)
returns a list(包含元素 cond
(条件模型参数),zi
(零-inflation 参数),disp
(色散参数)而不是向量。
如果您将此位替换为 glmmTMB::fixef(reg)[["cond"]]
,它可能会起作用。