R 多项式比逼近

R 多项式比逼近,r,regression,curve-fitting,approximation,polynomials,R,Regression,Curve Fitting,Approximation,Polynomials,我正在尝试将多项式拟合到我的数据集,如下所示(完整的数据集在文章的末尾): 理论预测曲线的公式为: 如下所示(对于0和1之间的x): 当我尝试在R中创建线性模型时,请执行以下操作: mod <- lm(y ~ poly(x, 2, raw=TRUE)/poly(x, 2)) mod既然你已经有了一个理论预测,你似乎不需要一个新的模型,而且它实际上只是一个绘图任务: png(); plot(y~x) lines(x,mod,col="blue") dev.off() 您不能

我正在尝试将多项式拟合到我的数据集,如下所示(完整的数据集在文章的末尾):

理论预测曲线的公式为:

如下所示(对于0和1之间的x):

当我尝试在R中创建线性模型时,请执行以下操作:

mod <- lm(y ~ poly(x, 2, raw=TRUE)/poly(x, 2))

mod既然你已经有了一个理论预测,你似乎不需要一个新的模型,而且它实际上只是一个绘图任务:

 png(); plot(y~x)
 lines(x,mod,col="blue")
 dev.off()


您不能期望
lm
能够很好地近似非线性问题。理论表达式中包含x的分母使其具有固有的非线性。

使用
nls
拟合非线性模型。请注意,模型公式并非如问题所示唯一定义,因为如果我们将所有系数乘以任何数字,结果仍将给出相同的预测。为了避免这种情况,我们需要固定一个系数。第一次尝试使用问题中显示的系数作为起始值(除了修复一个),但失败了,因此尝试删除C,并将结果系数输入到第二次拟合中,使用
C=1

 st <- list(a = 43, b = -14, c = 25, B = 18)
 fm <- nls(y ~ (a + b * x + c * x^2) / (9 + B * x), start = st)
 fm2 <- nls(y ~ (a + b * x + c * x^2) / (9 + B * x + C * x^2), start = c(coef(fm), C = 1))

 plot(y ~ x)
 lines(fitted(fm2) ~ x, col = "red")

两个多项式的比率不会由线性模型估计。你需要使用非线性方法。在这种情况下,这是一个绘图任务,但我只想知道一般如何做,例如假设我们不知道理论公式。这个答案的最后一句话是决定性的。这不是一个线性问题,由于分母的原因,该公式无法用二阶多项式正确逼近。非常感谢您的帮助。非常感谢!但是,它会产生错误“coef(fm)中的错误:找不到对象'fm'。我们如何克服它呢?您需要一个更早的
fm
对象存在于工作区中,这样代码才能成功(Gabor曾提到)。相反,你可以用nls(y~(a+b*x+c*x^2)/(9+b*x+c*x^2),start=st)得到一个估计值。看到单个参数有多不稳定很有意思。我们修改了解决方案。如果我们有不同的图,并且对起始值没有太多的概念,会怎么样?有什么通用方法吗?如果你知道系数所在的范围,那么你可以使用nls2包使用蛮力或随机搜索,然后使用找到的最佳系数作为nls起始值。请参阅nls2附带的示例。
 png(); plot(y~x)
 lines(x,mod,col="blue")
 dev.off()
 st <- list(a = 43, b = -14, c = 25, B = 18)
 fm <- nls(y ~ (a + b * x + c * x^2) / (9 + B * x), start = st)
 fm2 <- nls(y ~ (a + b * x + c * x^2) / (9 + B * x + C * x^2), start = c(coef(fm), C = 1))

 plot(y ~ x)
 lines(fitted(fm2) ~ x, col = "red")
library(nls2)

set.seed(123) # for reproducibility
v <- c(a = 50, b = 50, c = 50, B = 50, C = 50)
st0 <- as.data.frame(rbind(-v, v))
fm0 <- nls2(y ~ (a + b * x + c * x^2) / (9 + B * x + C * x^2), start = st0,
   alg = "random", control = list(maxiter = 1000))

fm3 <- nls(y ~ (a + b * x + c * x^2) / (9 + B * x + C * x^2), st = coef(fm0))