Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:完美平滑曲线_R_Graphics - Fatal编程技术网

R:完美平滑曲线

R:完美平滑曲线,r,graphics,R,Graphics,我正在尝试将平滑曲线拟合到我的数据集;是否有比我使用以下代码生成的平滑曲线更好的平滑曲线: x <- seq(1, 10, 0.5) y <- c(1, 1.5, 1.6, 1.7, 2.1, 2.2, 2.2, 2.4, 3.1, 3.3, 3.7, 3.4, 3.2, 3.1, 2.4, 1.8, 1.7, 1.6, 1.4) lo <- loess(y~x) plot(x,y) xv <- seq(min(x),max(

我正在尝试将平滑曲线拟合到我的数据集;是否有比我使用以下代码生成的平滑曲线更好的平滑曲线:

x <- seq(1, 10, 0.5)
y <- c(1, 1.5, 1.6, 1.7, 2.1,
       2.2, 2.2, 2.4, 3.1, 3.3,
        3.7, 3.4, 3.2, 3.1, 2.4,
        1.8, 1.7, 1.6, 1.4)
lo <- loess(y~x)
plot(x,y)
xv <- seq(min(x),max(x), (max(x) - min(x))/1000000)
lines(xv, predict(lo,xv), col='blue', lwd=1)

x正如所提出的那样,这个问题几乎毫无意义。没有所谓的“最佳”匹配线,因为“最佳”取决于你的学习目标。生成一条平滑的线来拟合每个数据点是相当简单的(例如,一个18阶多项式将完美地拟合您的数据,但很可能毫无意义)

也就是说,您可以通过更改
span
参数来指定
黄土
模型的平滑度。跨距值越大,曲线越平滑,跨距值越小,它将越适合每个点:

这是一个值为
span=0.25
的绘图:

x <- seq(1, 10, 0.5)
y <- c(1, 1.5, 1.6, 1.7, 2.1,
    2.2, 2.2, 2.4, 3.1, 3.3,
    3.7, 3.4, 3.2, 3.1, 2.4,
    1.8, 1.7, 1.6, 1.4)

xl <- seq(1, 10, 0.125)
plot(x, y)
lines(xl, predict(loess(y~x, span=0.25), newdata=xl))

您得到了19个点,因此一个最大为X^18的多项式将对您的每个点进行布尔西运算:

> xl=seq(0,10,len=100)
> p=lm(y~poly(x,18))
> plot(x,y)
> lines(xl,predict(p,newdata=data.frame(x=xl)))

但这忽略了统计数据的全部内容。这是关于承认曲线不适合通过点。找到一个包含少量参数的模型,尽可能多地解释数据,只留下噪声。这并不是用一条曲线来突出你的点-这样绘制的曲线在数据点之间没有什么意义。

我想也许你在寻找一条插值平滑线,在R的情况下,这可能最容易通过拟合插值样条曲线来实现?正如其他答案所讨论的那样,这不是统计拟合的意义所在,但在许多情况下,你需要一条平滑的插值曲线——我认为你的术语可能会让人反感

样条曲线在数值上比多项式更稳定

x <- seq(1, 10, 0.5)
y <- c(1, 1.5, 1.6, 1.7, 2.1,
    2.2, 2.2, 2.4, 3.1, 3.3,
    3.7, 3.4, 3.2, 3.1, 2.4,
    1.8, 1.7, 1.6, 1.4)

library(splines)

isp <- interpSpline(x,y)

xvec <- seq(min(x),max(x),length=200)  ## x values for prediction

png("isp.png")
plot(x,y)
## predict() produces a list with x and y components
lines(predict(isp,xvec),col="red")
dev.off()

x你说的更好是什么意思?无论如何,这个问题似乎更适合stats.stackexchange.complotting一百万个平滑点(您可以使用
seq(min(x)、max(x)、length.out=1e6)
)对于19个点之间的平滑来说,似乎有些过火了……完美意味着更适合点。我尝试了不到1e6,但无法接近最佳拟合…我正在寻找黄土的替代品,如果它能更接近曲线。如果更好意味着更好看,你可能想看看ggplot2的平滑几何图形:我不是说完美意味着好看(实际上是点对点),而是更接近观察到的数据点这给了我答案,也许我的问题正如你所建议的那样直截了当……谢谢你的回答和对答案的猜测。我还添加了一种使用样条线的替代方法,可能对你的情况有用。
x <- seq(1, 10, 0.5)
y <- c(1, 1.5, 1.6, 1.7, 2.1,
    2.2, 2.2, 2.4, 3.1, 3.3,
    3.7, 3.4, 3.2, 3.1, 2.4,
    1.8, 1.7, 1.6, 1.4)

library(splines)

isp <- interpSpline(x,y)

xvec <- seq(min(x),max(x),length=200)  ## x values for prediction

png("isp.png")
plot(x,y)
## predict() produces a list with x and y components
lines(predict(isp,xvec),col="red")
dev.off()