为什么R的predict函数会对使用bs样条的glmerMod模型抛出错误,在这种情况下如何获得模型预测?

3j86kqsm  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(78)

我尝试使用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。
我想知道我的代码中是否有错误,我是否应该使用不同的函数来获得预测,我试图做的事情是否存在某种缺陷,或者是否在其中一个包中存在错误。任何帮助都非常感谢。

4ioopgfo

4ioopgfo1#

TL;DR

这个问题来自非标准的计算,因为您将1L而不是1传递给bsdegree参数,这一事实导致了问题的发生

说明

错误实际上是从model.frame.mermod内部抛出的,其中模型框架具有从您的公式完全按原样捕获的列名:

[1] "y"                             "bs(x, knots = 0, degree = 1L)"
[3] "group_no"

字符串
而函数试图使用最终从stats::terms.formula获得的变量名子集。这将参数通过一个C函数,在这个过程中,L1L中删除,结果是:

[1] "y"                            "bs(x, knots = 0, degree = 1)"


由于第二个字符串与第二个列名不匹配(由于缺少L),您会得到“selected columns names selected”错误。
我想你可以称之为bug,但是重写代码是一个相当大的任务,以掩盖用户在公式右手边的某个数字后面写一个不必要的L的可能性。

解决方案

你需要做的就是将1L更改为1,一切都按预期工作:

glmer_spline <- glmer(y ~ bs(x,
                             knots = 0,
                             degree = 1) +
                        (1 | group_no),
                      data = simulated_data,
                      family = poisson(link = "log"),
                      control = glmerControl(optimizer="bobyqa")
)


那么运行时就不会出现错误

prediction_output_splines <- predict(glmer_spline,
                                     newdata = simulated_data,
                                     type = "response",
                                     allow.new.levels = TRUE,
                                     re.form=~0)


给你

head(prediction_output_splines)
#>         1        2        3        4        5        6 
#>  7.495069 7.495069 7.495069 7.495069 7.495069 7.495069

相关问题