我尝试使用predict
函数为具有splines::bs
项的glmer
模型获取模型拟合值。predict
函数抛出以下错误:
Error in `[.data.frame`(fr, vars) : undefined columns selected
字符串
以下是使用模拟数据的可再现示例:
# Reproducible example of glmer spline predict problem
library(tibble)
library(dplyr)
library(splines)
library(lme4)
## Simulate data
set.seed(1234L)
n_groups <- 100L
num_per_group <- rpois(n_groups, 50L) + 1L
group_mean <- rnorm(n_groups, sd = 0.2)
x_vals <- c(-20:19)
simulated_data <- tibble(x = sample(x_vals,
sum(num_per_group),
replace = TRUE),
group_no = rep(c(1:n_groups),
num_per_group),
group_mean = rep(group_mean,
num_per_group)) %>%
arrange(x, group_no) %>%
mutate(lin_pred = 3 - 0.05*abs(x) + group_mean,
y = exp(lin_pred + rnorm(sum(num_per_group),
mean = 0, sd = 0.1)),
y = round(y))
# Fit model
glmer_spline <- glmer(y ~ bs(x,
knots = c(0),
degree = 1L) +
(1 | group_no),
data = simulated_data,
family = poisson(link = "log"),
control = glmerControl(optimizer="bobyqa")
)
summary(glmer_spline)
# This throws an error:
# Error in `[.data.frame`(fr, vars) : undefined columns selected
prediction_output_splines <- predict(glmer_spline,
newdata = simulated_data,
type = "response",
allow.new.levels = TRUE,
re.form=~0)
型
我正在使用R版本4.2.3(2023-03-15),tibble 3.2.1,dplyr 1.1.2,lme 4 1.1-34,在RStudio“Mountain Hydrangea”Release(547 dcf 86,2023-07-06)中用于运行Ventura 13.4.1的2019 MacBook Pro上的macOS。
我想知道我的代码中是否有错误,我是否应该使用不同的函数来获得预测,我试图做的事情是否存在某种缺陷,或者是否在其中一个包中存在错误。任何帮助都非常感谢。
1条答案
按热度按时间4ioopgfo1#
TL;DR
这个问题来自非标准的计算,因为您将
1L
而不是1
传递给bs
的degree
参数,这一事实导致了问题的发生说明
错误实际上是从
model.frame.mermod
内部抛出的,其中模型框架具有从您的公式完全按原样捕获的列名:字符串
而函数试图使用最终从
stats::terms.formula
获得的变量名子集。这将参数通过一个C函数,在这个过程中,L
从1L
中删除,结果是:型
由于第二个字符串与第二个列名不匹配(由于缺少
L
),您会得到“selected columns names selected”错误。我想你可以称之为bug,但是重写代码是一个相当大的任务,以掩盖用户在公式右手边的某个数字后面写一个不必要的
L
的可能性。解决方案
你需要做的就是将
1L
更改为1
,一切都按预期工作:型
那么运行时就不会出现错误
型
给你
型