使用变量存储公式调用C5.0绘图时出现“未定义列”错误的问询
问题解答:C50包中使用变量公式时
plot()报错的问题 首先明确:这是C50与partykit的plot方法交互时的非预期但可解释的行为,核心原因在于模型的call属性记录的是原始调用结构,而非解析后的公式内容,导致as.party()提取响应变量时出错。你的调试结论完全准确——当用变量传递公式时,match.call()保存的调用里formula参数是变量名formula,而非实际的ID ~ .,这才让as.party()误把"formula"当成了响应变量。
针对批量测试不同公式的需求,这里有两个可靠的解决方法:
方法1:用do.call()构造模型调用
do.call()会直接把公式对象传递给C5.0,让match.call()捕获到解析后的公式,而非变量名。示例代码:
library("partykit") library("C50") # 创建示例数据框 data <- data.frame(ID = c(1, 2, 3, 4, 5), var1 = c('a', 'b', 'c', 'd', 'e'), var2 = c(1, 1, 0, 0, 1)) variable <- "ID" data[, variable] <- factor(data[, variable]) formula <- as.formula(paste(variable, " ~ .")) # 使用do.call传递公式,确保call记录正确的公式内容 model <- do.call(C5.0, list(formula = formula, data = data, trials = 10)) plot(model) # 此时绘图正常
方法2:手动修正模型的call属性
如果已经拟合好模型,不想重新运行,可以直接修改模型对象的call属性,把formula参数替换为实际的公式:
model <- C5.0(formula, data=data, trials=10) # 替换call中的formula参数为实际的公式对象 model$call$formula <- formula plot(model) # 同样可以正常绘图
这两种方法都能让as.party()正确识别响应变量,解决绘图报错的问题,非常适合批量测试不同公式的场景。
内容的提问来源于stack exchange,提问作者Ale Sanchez
相关产品推荐
相关产品推荐

