我想将不同的逻辑模型应用到数据仓库中的变量列表中。glm()和lme4::glmer()以及mgcv::gam()都可以正常工作。但是函数gam::gam()我不能与lapply一起使用。
示例:
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)有什么办法纠正这个错误吗?
发布于 2021-03-30 10:48:41
您可以在这里使用get,如下所示,它应该工作或eval(parse(text=x)),而不是get
gam_list <- lapply(xlist, function(x){
gam::gam(y ~ s(get(x)), data = df, family = binomial)
}) 输出
[[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 发布于 2021-03-30 11:00:40
还可以将字符串转换为公式。
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 https://stackoverflow.com/questions/66869113
复制相似问题