使用fitModel函数进行R非线性模型拟合

时间:2019-04-27 04:10:28

标签: r model non-linear-regression

我想使非线性模型适合实际数据。

实际数据由2个已知的数字矢量组成;厚度为“ x”,fh为“ y”

thickness=seq(0.15,2.00,by=0.05)

fh = c(5.17641, 4.20461, 3.31091, 2.60899, 2.23541, 1.97771, 1.88141, 1.62821, 1.50138, 1.51075, 1.40850, 1.26222, 1.09432, 1.13202, 1.12918, 1.10355, 1.11867, 1.09740,1.08324, 1.05687, 1.19422, 1.22984, 1.34516, 1.19713,1.25398 ,1.29885, 1.33658, 1.31166, 1.40332, 1.39550,1.37855, 1.41491, 1.59549, 1.56027, 1.63925, 1.72440, 1.74192, 1.82049)
plot(thickness,fh)

这显然是非线性的。因此,我正在尝试将此模型拟合为

的非线性函数
y= x*2/3+(2+2*a)/(3*x)

变量a是一个未知常数,我正在尝试找到最佳常数a,该常数将回归线与实际数据之间的误差平方和最小化。

我首先使用了在YouTube视频Fitting Functions to Data in R上找到的功能fitModel

 library(TIMP)
 f=fitModel(fh~thickness^2/3+(2+2*A)/(3*thickness)) #it finds the coefficient 'A'
coef(f) # to represent just the coefficient

但是,有一个错误

  

modelspec [[datasetind [i]]]中的错误:下标超出范围

因此,作为替代,希望找到“ a”和“误差平方和”的图。这次,我很难找到“ a”并绘制此图。通过手动工作,我发现值“ a”大约在0.2左右,但这不是一个精确值。

如果有人可以表现出以下任何一种都会有所帮助:

  1. 为什么fitModel函数不起作用或
  2. 如何找到值a并绘制图形。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

yf = function(a,xv) xv*(2/3)+(2+2*a)/(3*xv)
yf(2,thickness)
f <- function (a,y, xv) sum((y - yf(a,xv))^2)
f(2,fh,thickness)
xmin <- optimize(f, c(0, 10), tol = 0.0001, y=fh,xv=thickness)
xmin
plot(thickness,fh)
lines(thickness,yf(xmin$minimum,thickness),col=3)

enter image description here