R 如何找到非线性模型的起始值?
在Windows 10上使用RStudio v1.3.1093,R v.4.0.2 我正在处理一个家庭作业问题,并给出了一个数据集:R 如何找到非线性模型的起始值?,r,non-linear-regression,R,Non Linear Regression,在Windows 10上使用RStudio v1.3.1093,R v.4.0.2 我正在处理一个家庭作业问题,并给出了一个数据集: x <- cbind(c(8, 8, 14, 14, 14, 16, 16, 16, 18, 18, 20, 20, 20, 22, 22, 22, 24, 24, 24, 26, 26, 26, 28, 28, 30, 30, 30, 32, 32, 34, 36, 36, 42)) y <- cbind(c(0.49, 0.49, 0.45, 0.
x <- cbind(c(8, 8, 14, 14, 14, 16, 16, 16, 18, 18, 20, 20, 20, 22, 22, 22, 24, 24, 24, 26, 26, 26, 28, 28, 30, 30, 30, 32, 32, 34, 36, 36, 42))
y <- cbind(c(0.49, 0.49, 0.45, 0.43, 0.43, 0.44, 0.43, 0.43, 0.46, 0.45, 0.42, 0.42, 0.43, 0.41, 0.41, 0.40, 0.42, 0.40, 0.40, 0.41, 0.40, 0.41, 0.41, 0.40, 0.40, 0.40, 0.38, 0.41, 0.40, 0.40, 0.41, 0.38, 0.39))
df <- data.frame('x' = x, 'y' = y)
要获取初始值,但当我适合模型时:
fit <- nls(y ~ a - b*exp(-c*x), data = df, start = list(a = i[1], b = i[2], c = i[3]))
fit我认为您可能使用了错误的自启动功能。在这种情况下,可以绘制点,并在绘制曲线时旋转参数,从而使nls
足够接近:
x0.38621-0.21016 0.09033
#>剩余平方和:0.003971
#>
#>收敛的迭代次数:4
#>达到收敛公差:2.089e-08
绘图(df)
行(5:50,预测(拟合,新数据=列表(x=5:50)),col=“红色”,lty=2)
如果你想要一些自动接近起点的东西(并且不想写一个自我开始),你可以做一些假设:
假设c为正(即,图中显示的衰变类似于半衰期曲线,如数据所示),则exp(-c*x)
将在大x时趋于零,因此只要数据中有一个合理的范围,y
的最小值可能接近a
如果我们从估计的a
中减去y数据,b
的值与通过结果点的线性回归的截距不会太远
通过将这些新y值的对数除以b
所创建的回归线的斜率将接近-c
因此,我们可以为这种类型的曲线创建一个粗略的、现成的估计器,如下所示:
roughstart我认为您可能使用了错误的自启动功能。在这种情况下,可以绘制点,并在绘制曲线时旋转参数,从而使nls
足够接近:
x0.38621-0.21016 0.09033
#>剩余平方和:0.003971
#>
#>收敛的迭代次数:4
#>达到收敛公差:2.089e-08
绘图(df)
行(5:50,预测(拟合,新数据=列表(x=5:50)),col=“红色”,lty=2)
如果你想要一些自动接近起点的东西(并且不想写一个自我开始),你可以做一些假设:
假设c为正(即,图中显示的衰变类似于半衰期曲线,如数据所示),则exp(-c*x)
将在大x时趋于零,因此只要数据中有一个合理的范围,y
的最小值可能接近a
如果我们从估计的a
中减去y数据,b
的值与通过结果点的线性回归的截距不会太远
通过将这些新y值的对数除以b
所创建的回归线的斜率将接近-c
因此,我们可以为这种类型的曲线创建一个粗略的、现成的估计器,如下所示:
roughstart1)使用SSASSYMP
运行nls,然后适当转换参数,给出以下st
中的答案。如果希望完全使用参数化进行干净运行,请使用转换后的参数作为起始值再次运行nls,如下所示。第二次运行将有0次迭代,因为我们从最佳状态开始
fit0 <- nls(y ~ SSasymp(x, Asym, R0, lrc), df)
st <- with(as.list(coef(fit0)), c(a = Asym, b = Asym - R0, c = exp(lrc)))
nls(y ~ a - b * exp(-c*x), data = df, start = st)
2)如图所示,使用问题中的数据运行nls没有问题,但如果您对不同的数据有问题,并且需要第二个选项,请尝试drc包中的AR.3模型。下面的代码遵循上面的代码,除非我们进行更改以适应不同的参数化
library(drc)
fit1 <- drm(y ~ x, data = df, fct = AR.3())
co <- setNames(coef(fit1), c("c", "d", "e"))
st <- with(as.list(co), c(a = d, b = d - c, c = 1/e))
nls(y ~ a - b * exp(-c*x), data = df, start = st)
库(drc)
fit11)使用SSASSYMP
运行nls,然后适当转换参数,给出如下st
所示的答案。如果希望完全使用参数化进行干净运行,请使用转换后的参数作为起始值再次运行nls,如下所示。第二次运行将有0次迭代,因为我们从最佳状态开始
fit0 <- nls(y ~ SSasymp(x, Asym, R0, lrc), df)
st <- with(as.list(coef(fit0)), c(a = Asym, b = Asym - R0, c = exp(lrc)))
nls(y ~ a - b * exp(-c*x), data = df, start = st)
2)如图所示,使用问题中的数据运行nls没有问题,但如果您对不同的数据有问题,并且需要第二个选项,请尝试drc包中的AR.3模型。下面的代码遵循上面的代码,除非我们进行更改以适应不同的参数化
library(drc)
fit1 <- drm(y ~ x, data = df, fct = AR.3())
co <- setNames(coef(fit1), c("c", "d", "e"))
st <- with(as.list(co), c(a = d, b = d - c, c = 1/e))
nls(y ~ a - b * exp(-c*x), data = df, start = st)
库(drc)
根据你的数据,我在R4.0.3和Mac Big Sur 10.16上运行良好,即getInitial(y~SSasymp(x,a,b,c),data=df)#ab c 0.3854869 0.5906224-2.4551192
这些也是我得到的值。但是当我使用这些值来拟合模型时,也就是我得到错误的时候。你能展示给出错误的代码以便测试吗?我用模型更新了帖子。有了你的数据,我在R4.0.3和Mac Big Sur 10.16上运行得很好,即getInitial(y~SSasymp(x,a,b,c),data=df)#a b c 0.3854869 0.5906224-2.4551192
这些也是我得到的值。但是,当我使用这些值来拟合模型时,也就是我得到错误的时候。你能展示给出错误的代码以便测试它吗。