使用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
相关产品推荐
相关产品推荐

