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

使用R语言nls函数时lines函数报xy.coords错误的解决咨询

问题原因及解决方法

核心问题

你的非线性回归模型将x作为因变量、y作为自变量(公式:x ~ Y0*exp(-a*y)),但调用predict时错误传入了因变量x的取值,而非模型需要的自变量y的取值。由于newdata中缺少y,predict默认使用原始数据的6个y值,导致预测结果长度仅为6,而你用来绘图的b(长度416)和预测结果长度不匹配,触发'x' and 'y' lengths differ错误。

解决方法(二选一)

方法1:基于现有模型绘制拟合线

既然模型是x = Y0*exp(-a*y),我们可以生成一系列y的取值,预测对应的x,再按x排序后绘制(保证线条连贯):

x = c(400,240,230,130,117,28)
y = c(0,15,35,85,110,135)
df = data.frame(x,y)

plot(x,y,ylim=rev(range(y)),ylab='y',xlab='x',las=1)
m=nls(x~Y0*exp(-a*y),data=df,start=list(Y0=415,a=0.015))

# 生成y的序列,覆盖原始y的范围,取足够多点保证线条平滑
new_y = seq(min(df$y), max(df$y), length.out = 100)
# 传入y的新值预测x
pred_x = predict(m, list(y = new_y))
# 按x排序,避免线条乱序
fit_df = data.frame(pred_x, new_y)
fit_df = fit_df[order(fit_df$pred_x), ]
# 绘制拟合线
lines(fit_df$pred_x, fit_df$new_y, type="l", col="blue")

方法2:重新拟合以y为因变量的模型

如果你习惯以x为横轴、直接用x的序列预测y,可以重新拟合模型(将y作为因变量):

x = c(400,240,230,130,117,28)
y = c(0,15,35,85,110,135)
df = data.frame(x,y)

plot(x,y,ylim=rev(range(y)),ylab='y',xlab='x',las=1)
# 重新拟合模型:y关于x的函数,从原公式变形得到 y = -(1/a)*ln(x/Y0)
m = nls(y ~ -log(x/Y0)/a, data=df, start=list(Y0=415,a=0.015))

# 生成x的序列,覆盖原始x的范围
new_x = seq(min(df$x), max(df$x), length.out = 100)
# 传入x的新值预测y
pred_y = predict(m, list(x = new_x))
# 绘制拟合线
lines(new_x, pred_y, type="l", col="blue")

两种方法都能解决长度不匹配的问题,并且顺利绘制拟合线。你可以根据自己的分析需求选择其中一种。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:52:53