You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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
)

关键说明

  1. add=TRUE:必须添加这个参数,让预测曲线叠加在原始数据散点图上,否则每次循环会生成新图覆盖之前内容。
  2. 关联x变量:无论是用!!sym()还是setNames,核心都是让curve()生成的x序列作为模型输入变量,这样才能计算对应区间内的所有预测值。
  3. 绘图顺序:先画散点再画曲线,避免曲线被散点覆盖,保证对比效果清晰。

内容的提问来源于stack exchange,提问作者Andreia Raposo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 09:20:06