1

我只有 4 个数据点:

points = c(60, 46, 46, 60)

那个“想要”来描述抛物线。但显然,我找不到让它顺利的方法。取而代之的是,我使用以下代码最终得到了下面的红色方框图:

plot(points, ylim=c(40,60), pch = 20, col = 2, cex = 2)
fit = loess(points ~ c(1:4), bw=nrd0, na.rm=T)
lines(predict(fit), lwd=2, col= 2)

不知道有没有什么办法可以让边角变得光滑,这样看起来更像蓝线...

在此处输入图像描述

4

2 回答 2

6

正如您收到的消息中所述,loess对这么少的点不满意。但是您可以使用以下方法获得一条漂亮的曲线spline

points = c(60, 46, 46, 60)
plot(points, ylim=c(40,60), pch = 20, col = 2, cex = 2)
lines(spline(1:4, points, n=100))

在此处输入图像描述

于 2016-04-16T03:56:44.397 回答
2

由于您想拟合二次方,您可以按如下方式获得所需的内容。假设二次函数是

f(x) = a*x^2 + b*x + c

然后我们知道

a+b+c = 60
4a+2b+c = 46
9a+3b+c = 46

通过等同f(1),f(2),f(3)points[1:3]points]由于对称性,我们可以忽略第四个元素。a,b,c是一组线性方程组的解A %*% x = points。所以构造矩阵A如下

A <- matrix(c(1,1,1,4,2,1,9,3,1),nrow=3,byrow=TRUE)

然后求解线性方程组:

pcoef <- solve(A,points[1:3])

现在得到你想要做的图表

f <- function(x,pcoef)  pcoef[1]*x^2 + pcoef[2]*x + pcoef[3]
g <- function(x) f(x,pcoef)

plot(points, ylim=c(40,60), pch = 20, col = 2, cex = 2)
curve(g,from=1,to=4,add=TRUE, col="blue")

在此处输入图像描述

于 2016-04-16T07:45:06.960 回答