使用curve()绘制原始数据与最佳模型预测时出现报错
解决curve()绘制多项式模型预测曲线的报错问题
报错原因
curve()函数要求第一个参数必须是包含变量x的表达式、函数或调用——它会自动生成x序列(从from到to),并基于x计算对应的值。你的代码里直接用get(normalized_columns[i])传入原数据列,没有关联x,导致函数无法识别要生成的预测序列,因此抛出'expr' must be a function, or a call or an expression containing 'x'错误。
解决方案
把模型预测逻辑包装成以x为参数的函数,让curve()能将自动生成的x序列传入模型计算预测值;同时先绘制原始数据点,再叠加预测曲线,实现“原始数据vs模型预测”的对比效果。
修改后代码
library(rlang) # 使用!!sym()需加载rlang包,也可用下文替代方案不用该包 par(mfrow=c(2, 3)) for (i in 1:6) { # 绘制原始数据散点 plot( x = filtered_resp_data[[normalized_columns[i]]], y = filtered_resp_data$xxx, # 替换为你的实际响应变量列名 col = "black", pch = 16, xlab = normalized_columns[i], ylab = "xxx", main = paste("Real Data vs. Best Model (Degree", best_models[[i]]$best_degree, ")") ) # 用curve叠加模型预测曲线 curve( expr = predict( best_models[[i]]$best_model, newdata = data.frame(!!sym(normalized_columns[i]) := x) ), from = min(filtered_resp_data[[normalized_columns[i]]]), to = max(filtered_resp_data[[normalized_columns[i]]]), col = "blue", lwd = 2, add = TRUE # 叠加到已有的散点图上 ) }
替代方案(无需rlang包)
如果不想加载rlang,可以用setNames动态设置列名:
curve( expr = predict( best_models[[i]]$best_model, newdata = setNames(data.frame(x), normalized_columns[i]) ), from = min(filtered_resp_data[[normalized_columns[i]]]), to = max(filtered_resp_data[[normalized_columns[i]]]), col = "blue", lwd = 2, add = TRUE )
关键说明
add=TRUE:必须添加这个参数,让预测曲线叠加在原始数据散点图上,否则每次循环会生成新图覆盖之前内容。- 关联
x变量:无论是用!!sym()还是setNames,核心都是让curve()生成的x序列作为模型输入变量,这样才能计算对应区间内的所有预测值。 - 绘图顺序:先画散点再画曲线,避免曲线被散点覆盖,保证对比效果清晰。
内容的提问来源于stack exchange,提问作者Andreia Raposo
相关产品推荐
相关产品推荐

