You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动为列名添加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')))存在两个问题:

  1. 语法错误:paste0')'的引号与括号不匹配,正确写法是paste0("s(", names_Boston, ")"),无需嵌套多层paste0
  2. 工具误用:set_names的作用是给向量命名,并非生成带s()的表达式字符串

内容的提问来源于stack exchange,提问作者Russ Conte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:45:11