首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用mgcv::gam进行非标准评估

用mgcv::gam进行非标准评估
EN

Stack Overflow用户
提问于 2018-12-12 10:03:17
回答 1查看 166关注 0票数 3

我正在创建一个函数,它将未评估的对回归函数的调用作为输入,创建一些数据,然后对调用进行评估。下面是一个示例:

代码语言:javascript
复制
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)

我这么做的原因是,我正在进行一项模拟研究,我在许多蒙特卡罗样本上拟合了许多不同的模型。函数是内部包的一部分,我想提供模型列表,然后在包中进行评估。

我还想使用来自mgcvmgcv函数。在gam的文档中,下面介绍了它的data参数,它实际上相当于lm的文档

包含模型响应变量和公式所需协变量的数据框架或列表。默认情况下,变量来自环境(公式):通常是调用gam的环境。

因此,我尝试使用相同的逻辑计算gam,认为上面定义的compute_fit函数中的eval(m, envir = df)应该在df环境中计算公式。

代码语言:javascript
复制
# Try with gam
library(mgcv)
gamcall = call("gam", quote(list(formula = y ~ x)))    
compute_fit(gamcall)  

但是,这与错误消息失败:

eval(predvars,data,env)中的错误:找不到对象'y‘

我意识到这个错误可能与this question有关,但是我的问题是,是否有人能想出一个解决办法,让我可以像使用其他建模函数一样使用gam?据我所知,有关问题并没有为这个问题提供解决办法。

下面是一个完整的reprex:

代码语言:javascript
复制
set.seed(1)
library(lme4)
#> Loading required package: Matrix
compute_fit <- function(m){
  # Generate some data
  df <- data.frame(x = rnorm(100), ID = rep(1:50, 2))
  df$y <- df$x + rnorm(100, sd = .1)
  # 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)

# Try with gam
library(mgcv)
#> Loading required package: nlme
#> 
#> Attaching package: 'nlme'
#> The following object is masked from 'package:lme4':
#> 
#>     lmList
#> This is mgcv 1.8-26. For overview type 'help("mgcv-package")'.
gamcall = call("gam", quote(list(formula = y ~ x)))    
compute_fit(gamcall)    
#> Error in eval(predvars, data, env): object 'y' not found
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-12 11:19:10

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

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53740495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档