R 无法创建更平滑的曲线拟合打印

R 无法创建更平滑的曲线拟合打印,r,R,如何平滑拟合曲线 XY <- data.frame(cbind(Values = c(91.8, 95.3, 99.8, 123.3, 202.9, 619.8, 1214.2, 1519.1, 1509.2, 1523.3, 1595.2, 1625.1), Concn = c(1000, 300, 100, 30, 10, 3, 1, 0.3, 0.1, 0.03, 0.01, 0))) nls.fit <

如何平滑拟合曲线

XY <- data.frame(cbind(Values = c(91.8, 95.3,   99.8,   123.3,  202.9,  619.8,  1214.2, 1519.1, 1509.2, 1523.3, 1595.2, 1625.1),
            Concn = c(1000, 300,    100,    30, 10, 3,  1,  0.3,    0.1,    0.03,   0.01,   0)))
nls.fit <- nls(Values ~ (ymax* Concn / (ec50 + Concn)) + Ns*XY$Concn + ymin, data=XY,
                   start=list(ymax=max(XY$Values), ymin = min(XY$Values), ec50 = 3, Ns = 0.2045514))
plot(XY$Values ~ XY$Concn , data = XY, col = 4, main = "XY Std curve", log = "x")
lines(XY$Concn, predict(nls.fit))
当我尝试以下脚本时,我得到错误消息

SmoothX <- seq(min(XY$Values), max(XY$Values), length = 100)
lines(SmoothX, predict(nls.fit,SmoothX), col='red', lwd=2)
函数公式错误,数据=NULL,子集=NULL,na.action=na.fail,: “SmoothX”的可变长度不同

如何修复错误


首先,我认为预测中使用的新数据应该使用浓度而不是数值:

SmoothX <- seq(min(XY$Concn), max(XY$Concn), length = 100)
数字[1:100]91.8107.3122.8138.3153.8

str(predict(nls.fit,SmoothX))
数字[1:12]109.54952.3120.6298.6

但是,如果包含listConcn=SmoothX,则会得到一个100个值的向量,因为新的数据向量长度为

 str(predict(nls.fit,list(Concn=SmoothX)))
数字[1:100]1714324.7175.5119.691.8

这样做效果更好,但它仍然给出了一个警告信息和一条丑陋的红线:c

lines(SmoothX, predict(nls.fit,list(Concn=SmoothX)), col='red', lwd=2)
警告信息: 在ymax*Concn/ec50+Concn+Ns*XY$Concn中: 较长的对象长度不是较短对象长度的倍数


首先,您需要在nls中使用不含XY$的公式:

如果你打算在对数X标度上绘图,这将有助于在对数标度上均匀分布预测值。您还需要预测数据是一个与模型中的预测变量具有相同变量名Conc的数据帧:

SmoothX <- with(XY,
      data.frame(Concn=10^seq(min(log10(Concn[Concn>0])),
                              max(log10(Concn)), length = 100)))
pp <- predict(nls.fit,SmoothX)
lines(SmoothX$Concn, pp, col='red', lwd=2)


 plot(Values ~ Concn , data = XY, col = 4, main = "XY Std curve",
     log = "x")
SmoothX <- with(XY,
      data.frame(Concn=10^seq(min(log10(Concn[Concn>0])),
                              max(log10(Concn)), length = 100)))
pp <- predict(nls.fit,SmoothX)
lines(SmoothX$Concn, pp, col='red', lwd=2)

首先确保XY按Concn的升序排序,以确保使用直线时,每个点都连接到下一个排序点,而不是其他点。还请确保从公式中删除XY,因为它已在数据参数中指定,如果存在,将导致问题。使用plot and lines参数subset可从plot and lines中使用的数据中排除0,因为它们指定对数比例

o <- order(XY$Concn)
XY <- XY[o, ]

fo <- Values ~ (ymax* Concn / (ec50 + Concn)) + Ns * Concn + ymin
st <- list(ymax=max(XY$Values), ymin = min(XY$Values), ec50 = 3, Ns = 0.2045514)
nls.fit <- nls(fo, data = XY, start = st)

plot(Values ~ Concn, XY, subset = Concn > 0, col = 4, log = "x")
title(main = "XY Std curve")
lines(predict(nls.fit, new = list(Concn = Concn)) ~ Concn, XY, subset = Concn > 0) ##
省略标记的行,然后运行上面的所有其余代码,包括我们得到的最后3行:


非常感谢。非常感谢您的指导,谢谢!我非常感谢你的指导。我喜欢你的答案,同样喜欢G.格罗森迪克的答案。因为G.格罗森迪克的答案是第一个答案,所以我选择了它。很抱歉感谢您逐步教授如何获得100个值的矢量进行绘图。这对很多像我这样的人都很有用。。
plot(Values ~ Concn , data = XY, col = 4, main = "XY Std curve",
     log = "x")
SmoothX <- with(XY,
      data.frame(Concn=10^seq(min(log10(Concn[Concn>0])),
                              max(log10(Concn)), length = 100)))
pp <- predict(nls.fit,SmoothX)
lines(SmoothX$Concn, pp, col='red', lwd=2)


 plot(Values ~ Concn , data = XY, col = 4, main = "XY Std curve",
     log = "x")
SmoothX <- with(XY,
      data.frame(Concn=10^seq(min(log10(Concn[Concn>0])),
                              max(log10(Concn)), length = 100)))
pp <- predict(nls.fit,SmoothX)
lines(SmoothX$Concn, pp, col='red', lwd=2)
o <- order(XY$Concn)
XY <- XY[o, ]

fo <- Values ~ (ymax* Concn / (ec50 + Concn)) + Ns * Concn + ymin
st <- list(ymax=max(XY$Values), ymin = min(XY$Values), ec50 = 3, Ns = 0.2045514)
nls.fit <- nls(fo, data = XY, start = st)

plot(Values ~ Concn, XY, subset = Concn > 0, col = 4, log = "x")
title(main = "XY Std curve")
lines(predict(nls.fit, new = list(Concn = Concn)) ~ Concn, XY, subset = Concn > 0) ##
logRange <- with(XY, log(range(Concn[Concn > 0])))
x <- exp(seq(logRange[1], logRange[2], length = 100))
lines(x, predict(nls.fit, new = list(Concn = x)))