R 使用mgcv::gam进行非标准评估

R 使用mgcv::gam进行非标准评估,r,gam,mgcv,R,Gam,Mgcv,我正在创建一个函数,它将对回归函数的未赋值调用作为输入,创建一些数据,然后对调用求值。以下是一个例子: library(lme4) compute_fit <- function(m){ # Generate some data df <- data.frame(x = rnorm(100), y = rnorm(100) + x, ID = sample(4, 100, replace = TRUE)) # Evaluate the call eval(m, env

我正在创建一个函数,它将对回归函数的未赋值调用作为输入,创建一些数据,然后对调用求值。以下是一个例子:

library(lme4)
compute_fit <- function(m){
  # Generate some data
  df <- data.frame(x = rnorm(100), y = rnorm(100) + x, ID = sample(4, 100, replace = TRUE))
  # Evaluate the call
  eval(m, envir = df)
}

# Create a list of models
models <- list(
  lm = call("lm", quote(list(formula = y ~ x))),
  glm = call("glm", quote(list(formula = y ~ x))),
  lmer = call("lmer", quote(list(formula = y ~ x + (1 | ID))))
)

# Evaluate the call (this works fine)
model_fits <- lapply(models, compute_fit)
但是,此操作失败,并显示错误消息:

eval(predvars、data、env)中出错:找不到对象“y”

我意识到这一错误可能与以下因素有关,但我的问题是,是否有人能想出一种变通方法,让我以与使用其他建模函数相同的方式使用
gam
?据我所知,相关问题并不能解决这个问题

下面是一个完整的reprex:

set.seed(1)
图书馆(lme4)
#>加载所需包:矩阵
计算拟合
#>lmList
#>这是mgcv 1.8-26。有关概述,请键入“帮助(“mgcv包”)”。
gamcall=call(“gam”,引号(列表(公式=y~x)))
计算拟合(gamcall)
#>eval(predvars、data、env)中出错:找不到对象“y”

我会将
df
添加到调用中,而不是在
df
中进行计算:

# Try with gam
library(mgcv)
gamcall = call("gam", quote(list(formula = y ~ x)))    
compute_fit(gamcall)  
compute_fit <- function(m){
  # Generate some data
  set.seed(1)
  df <- data.frame(x <- rnorm(100), y = rnorm(100) + x^3, ID = sample(4, 100, replace = TRUE))
  #add data parameter to call
  m[["data"]] <- quote(df)
  # Evaluate the call
  eval(m)
}

# Create a list of models
models <- list(
  lm = quote(lm(formula = y ~ x)),
  glm = quote(glm(formula = y ~ x)),
  lmer = quote(lmer(formula = y ~ x + (1 | ID))),
  gam = quote(gam(formula = y ~ s(x)))
)

model_fits <- lapply(models, compute_fit)
#works but lmer reports singular fit
计算拟合