如何生成适配glm.nb与stepaic的负二项回归变量交互分析公式?
解决负二项回归公式构建问题
我来帮你搞定这个公式构建的问题!你已经完成了交互项的生成工作,现在只需要把目标变量、主效应和交互项正确拼接成glm.nb和stepAIC能识别的公式对象就可以了。
问题分析
你当前代码里的target_formula<- target_col ~ interactions + combinations存在两个问题:
interactions是字符向量,直接放在公式里不会被解析成对应的变量名combinations没有定义,程序不知道它指代什么
下面是具体的解决方案:
方案1:基于你已生成的交互项列构建公式
你已经通过combn生成了两两交互的乘积列,我们可以直接提取这些列的名称,和主效应变量一起拼成公式:
library(dplyr) library(purrr) library(stringr) library(MASS) # stepAIC需要这个包 library(nycflights13) df <- nycflights13::weather interactions <- c("hour","dewp","humid","wind_dir","wind_speed") target_col <- "temp" # 生成交互项列(保留你的原有代码) out <- combn(interactions, 2, function(x) { df %>% dplyr::select(x) %>% transmute(!! str_c(x, collapse="_") := reduce(., `*`)) }, simplify = FALSE) %>% bind_cols() %>% bind_cols(df, .) # 提取交互项的列名 interaction_names <- names(out)[!names(out) %in% names(df)] # 构建公式字符串并转换为公式对象 formula_str <- paste(target_col, "~", paste(c(interactions, interaction_names), collapse = " + ")) target_formula <- as.formula(formula_str) # 拟合负二项模型并进行逐步回归 model <- glm.nb(target_formula, data = out) model_step <- stepAIC(model)
方案2:直接在公式中定义交互项(更简洁,无需额外生成列)
其实glm系列函数支持直接在公式中用:表示交互项,你不需要提前生成乘积列,这样代码更简洁:
library(dplyr) library(MASS) library(nycflights13) df <- nycflights13::weather interactions <- c("hour","dewp","humid","wind_dir","wind_speed") target_col <- "temp" # 生成所有两两交互项的公式字符串(比如hour:dewp, hour:humid...) interaction_terms <- combn(interactions, 2, function(x) paste(x, collapse = ":")) # 拼接主效应和交互项,构建完整公式 formula_str <- paste(target_col, "~", paste(c(interactions, interaction_terms), collapse = " + ")) target_formula <- as.formula(formula_str) # 建模和逐步回归 model <- glm.nb(target_formula, data = df) model_step <- stepAIC(model)
关键说明
- 无论哪种方案,都需要用
as.formula()把字符串转换成公式对象,这样glm.nb才能正确解析变量 stepAIC属于MASS包,记得提前加载- 方案2的好处是不需要修改原数据集,直接通过公式语法定义交互项,更符合R的建模习惯
内容的提问来源于stack exchange,提问作者Stat.Enthus
相关产品推荐
相关产品推荐

