首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:在变量列表中使用gam::gam和lapply

R:在变量列表中使用gam::gam和lapply
EN

Stack Overflow用户
提问于 2021-03-30 10:22:23
回答 2查看 131关注 0票数 1

我想将不同的逻辑模型应用到数据仓库中的变量列表中。glm()lme4::glmer()以及mgcv::gam()都可以正常工作。但是函数gam::gam()我不能与lapply一起使用。

示例:

代码语言:javascript
复制
n <- 1000                                                                                            
y <- rbinom(n,1,0.2)                                                                                 
x1 <- rnorm(n)                                                                                       
x2 <- rnorm(n)                                                                                       
xlist  <- list("x1", "x2")                                                                           
df <- data.frame(y, x1, x2)                                                                          

library(gam)

#doesn't work                                                                                                     
gam_list <- lapply(xlist, function(x){                                                              
  gam::gam(substitute(y ~ s(i), list(i = as.name(x))), data = df, family = binomial)                
})      
#Error in terms.default(formula, gam.slist, data = data) :
#no terms component nor attribute

gam <- gam(y ~ s(x1), data = df, family =binomial)

有什么办法纠正这个错误吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-30 10:48:41

您可以在这里使用get,如下所示,它应该工作或eval(parse(text=x)),而不是get

代码语言:javascript
复制
gam_list <- lapply(xlist, function(x){                                                              
  gam::gam(y ~ s(get(x)), data = df, family = binomial)                
})   

输出

代码语言:javascript
复制
[[1]]
Call:
gam::gam(formula = y ~ s(get(x)), family = binomial, data = df)

Degrees of Freedom: 999 total; 995 Residual
Residual Deviance: 1010.515 

[[2]]
Call:
gam::gam(formula = y ~ s(get(x)), family = binomial, data = df)

Degrees of Freedom: 999 total; 994.9997 Residual
Residual Deviance: 1011.254 
票数 1
EN

Stack Overflow用户

发布于 2021-03-30 11:00:40

还可以将字符串转换为公式。

代码语言:javascript
复制
gam_list <- lapply(xlist, function(x) 
            gam::gam(as.formula(sprintf('y~s(%s)', x)), data = df, family = binomial))

gam_list

#[[1]]
#Call:
#gam::gam(formula = as.formula(sprintf("y~s(%s)", x)), family = binomial, data = df)

#Degrees of Freedom: 999 total; 995 Residual
#Residual Deviance: 984.8362 

#[[2]]
#Call:
#gam::gam(formula = as.formula(sprintf("y~s(%s)", x)), family = binomial, data = df)

#Degrees of Freedom: 999 total; 995.0002 Residual
#Residual Deviance: 985.5421 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66869113

复制
相关文章

相似问题

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