如何自动为列名添加s()函数生成GAM平滑样条公式?
自动生成带
s()包裹的GAM平滑样条模型公式 问题背景
基于MASS包的Boston Housing数据集,需要自动构建形如medv ~ s(crim) + s(zn) + s(indus)的GAM模型公式,替代手动逐个添加s()的重复操作。
可行实现方法
Base R 方案
通过字符串拼接直接生成公式,步骤简洁高效:
library(MASS) library(gam) # 提取需要添加s()包裹的变量名(示例取前3列:crim、zn、indus) names_Boston <- names(Boston[, 1:3]) # 为每个变量名添加s()包裹 s_wrapped_vars <- paste0("s(", names_Boston, ")") # 拼接为完整公式字符串并转为公式对象 gam_formula <- as.formula(paste("medv ~", paste(s_wrapped_vars, collapse = "+"))) # 拟合GAM模型 Boston.splines <- gam(gam_formula, data = Boston)
Tidyverse 方案(可选)
若习惯用tidyverse工具链,可结合purrr处理变量名:
library(MASS) library(gam) library(tidyverse) names_Boston <- names(Boston[, 1:3]) # 批量为变量名添加s()包裹 s_wrapped_vars <- map_chr(names_Boston, ~ paste0("s(", ., ")")) # 拼接并转换为公式对象 gam_formula <- str_c("medv ~ ", str_c(s_wrapped_vars, collapse = "+")) %>% as.formula() # 拟合模型 Boston.splines <- gam(gam_formula, data = Boston)
之前错误的原因
你尝试的set_names(paste0('s(', paste0(names_Boston), paste0')))存在两个问题:
- 语法错误:
paste0')'的引号与括号不匹配,正确写法是paste0("s(", names_Boston, ")"),无需嵌套多层paste0 - 工具误用:
set_names的作用是给向量命名,并非生成带s()的表达式字符串
内容的提问来源于stack exchange,提问作者Russ Conte
相关产品推荐
相关产品推荐

