R语言建模:如何在含bs()项的公式中避免枚举大量列名
R逻辑回归批量纳入B样条项的实现方案
不需要逐一枚举bs()项,用R原生的公式动态生成函数就能快速实现,具体操作如下:
- 核心思路是提前把需要做样条转换的变量、分类变量分组存储,批量生成公式项后自动拼接,后续修改变量、调整参数只需要改对应变量集合即可,不用逐行编辑公式。
方法1:手动指定变量集合(最可控)
先明确区分需要套用bs()的数值变量、需要转因子的分类变量,再用reformulate()拼合公式:
library(splines) # 示例数据 df <- data.frame(a = c(0,1), b = c(0,1), d = c(0,1), e = c(0,1), f= c("m","f"), output = c(0,1)) # 1. 定义变量分组 num_vars <- c("a", "b", "d", "e") # 需要做B样条转换的数值变量 cat_vars <- c("f") # 作为分类因子纳入的变量 bs_df <- 2 # 统一设置B样条自由度 # 2. 批量生成公式项 bs_terms <- sprintf("bs(%s, df = %d)", num_vars, bs_df) cat_terms <- sprintf("factor(%s)", cat_vars) # 3. 拼接为完整模型公式 model_formula <- reformulate( termlabels = c(bs_terms, cat_terms), response = "output" ) # 4. 拟合模型 model <- glm(model_formula, data = df, family = "binomial")
如果不同数值变量需要设置不同的样条自由度,只要替换bs_terms的生成逻辑即可,比如给不同变量单独传df值,不需要逐个手写完整的bs()调用。
方法2:自动识别数值变量(适合变量极多的场景)
如果数据中除了结局变量、指定的分类变量外,其余所有数值变量都要做B样条转换,可以直接自动筛选变量,连变量名都不用手动枚举:
# 自动筛选所有数值型列,排除结局变量output num_vars <- names(df)[ sapply(df, is.numeric) & names(df) != "output" ] # 后续拼公式、拟合模型的逻辑和方法1完全一致
注意:如果部分数值变量不需要做样条转换,只要在筛选逻辑里把对应变量名排除即可,比逐个写
bs()项效率高很多。
内容的提问来源于stack exchange,提问作者Mathica
相关产品推荐
相关产品推荐

