如何用lapply生成语法正确的多模型公式?
解决lapply构造模型公式的冗余与语法错误问题
问题根源
你原代码的问题出在两点:
- 当
regr传入空字符串(' ')时,拼接自变量会产生带空格的无效片段,和随机效应项拼接后出现重复的+符号; - 当无额外自变量时,
+和*符号的组合逻辑完全一致,生成了完全相同的冗余模型。
修正方案
我们可以先明确需要的非冗余模型组合,再通过过滤空元素、合理拼接的方式构造公式,直接跳过字符串替换的麻烦(毕竟公式对象不适合用字符串处理工具修改)。
步骤1:定义模型核心组件
xnam <- "indipendent" # 基础自变量 regrs <- c("A", "B") # 可选的第二个自变量 symbs <- c("+", "*") # 变量关系符号(求和/交互) rand_eff <- "(1|C)" # 随机效应项 resp <- "dipendent outcome" # 响应变量
步骤2:生成非冗余的模型组合
直接排除无额外自变量时的重复组合,只保留一组:
model_specs <- rbind( # 有第二个自变量的情况:A/B 分别与 +/* 组合 expand.grid(regr = regrs, symb = symbs, stringsAsFactors = FALSE), # 仅基础自变量的情况:只保留一组 data.frame(regr = "", symb = "", stringsAsFactors = FALSE) )
步骤3:批量构造正确公式
通过过滤空元素、动态拼接的方式生成公式:
formulas <- lapply(seq(nrow(model_specs)), function(i) { spec <- model_specs[i, ] # 筛选有效自变量,去掉空字符串 vars <- c(xnam, spec$regr) vars <- vars[vars != ""] # 构造自变量表达式:单变量直接用,多变量用指定符号连接 if (length(vars) == 2) { pred_term <- paste(vars, collapse = spec$symb) } else { pred_term <- vars } # 合并自变量与随机效应,生成最终公式 reformulate(c(pred_term, rand_eff), response = resp) })
验证结果
运行后得到的formulas包含以下5个无冗余、无语法错误的公式:
dipendent outcome ~ indipendent + A + (1|C)dipendent outcome ~ indipendent * A + (1|C)dipendent outcome ~ indipendent + B + (1|C)dipendent outcome ~ indipendent * B + (1|C)dipendent outcome ~ indipendent + (1|C)
完全符合需求,没有重复符号和冗余模型。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

