r - nls 在某些数据子集上失败,但在其他类似的子集上失败
问题描述
我正在尝试按年份将 nls 函数应用于数据,因此每年都会有一个单独的 nls 函数。所有年份大致相似(指数衰减),但有些年份 nls() 函数因“奇异梯度”错误而失败。
有效的数据:
good_data = data.frame(y = c(8.46,6.87,5.81,6.62,5.85,5.79,4.83,4.94,4.95,5.27,5.05,5.38,5.08,3.98),
x = c(2,6,6,7,7,8,9,10,12,13,14,15,16,17))
失败的数据:
bad_data = data.frame(y = c(8.99,5.86,5.32,5.74,5.41,5.04,4.66,4.52,4.18,4.66,5.38,5.46,5.21,5.37,4.89),
x = c(2,6,6,7,7,8,9,10,11,12,13,14,15,16,17))
尝试 nls:
fit = nls(y ~ SSasymp(x, Asym, R0, lrc), data = good_data)
在我看来,这两组数据看起来非常相似。有什么方法可以诊断为什么一个失败而另一个没有?有什么我可以解决的吗?
谢谢
解决方案
下面我们展示了两种方法。如果您想自动执行此操作,您可能需要尝试直接拟合,如果失败则尝试 (2),如果失败则尝试 (1)。如果它们都失败了,那么数据可能并没有真正遵循模型并且不应该适合它。
如果数据都足够相似,另一种可以避免不同方法的迭代尝试的可能性是首先拟合所有数据,然后使用其中的起始值拟合每个数据集。见(3)。
1)如果您先通过样条拟合添加更多点,则它会收敛:
sp <- with(bad_data, spline(x, y))
fit2sp <- nls(y ~ SSasymp(x, Asym, R0, lrc), data = sp)
fit2sp
给予:
Nonlinear regression model
model: y ~ SSasymp(x, Asym, R0, lrc)
data: sp
Asym R0 lrc
5.0101 22.1915 -0.2958
residual sum-of-squares: 5.365
Number of iterations to convergence: 0
Achieved convergence tolerance: 1.442e-06
2)如果数据相似,另一种方法是使用先前成功拟合的起始值。
fit1 <- nls(y ~ SSasymp(x, Asym, R0, lrc), data = good_data)
fit2 <- nls(y ~ SSasymp(x, Asym, R0, lrc), data = bad_data, start = coef(fit1))
fit2
给予:
Nonlinear regression model
model: y ~ SSasymp(x, Asym, R0, lrc)
data: bad_data
Asym R0 lrc
4.9379 15.5472 -0.7369
residual sum-of-squares: 2.245
Number of iterations to convergence: 10
Achieved convergence tolerance: 7.456e-06
下面我们绘制两种解决方案:
plot(y ~ x, bad_data)
points(y ~ x, sp, pch = 20)
lines(fitted(fit2sp) ~ x, sp, col = "red")
lines(fitted(fit2) ~ x, bad_data, col = "blue", lty = 2)
legend("topright", c("data", "spline", "fit2sp", "fit2"),
pch = c(1, 20, NA, NA), lty = c(NA, NA, 1, 2),
col = c("black", "black", "red", "blue"))
3)如果所有数据都足够相似,另一种可行的方法是拟合所有数据,然后使用所有数据的起始值拟合各个数据集。
all_data <- rbind(good_data, bad_data)
fitall <- nls(y ~ SSasymp(x, Asym, R0, lrc), data = all_data)
fit1a <- nls(y ~ SSasymp(x, Asym, R0, lrc), data = good_data, start = coef(fitall))
fit2a <- nls(y ~ SSasymp(x, Asym, R0, lrc), data = bad_data, start = coef(fitall))
推荐阅读
- .net - 是否可以在单独的线程中创建控件,然后返回给 UI 线程使用?
- python - libjpeg 已安装并链接,但在安装其他库时未找到
- javascript - EmberJS:强制转换到父路由
- c# - C# SQLite 从 DB 中获取真正的价值会生成 Invalid Cast Exception
- javascript - Firefox 控制台无法定义变量
- python - VGG 输入未定义
- java - Spring 单元测试:使用 @SpyBean 模拟 void 方法:获取该 bean 的 NullPointerException,除非我使用 @Mock
- django - /users/profile/ 中的 TemplateDoesNotExist
- bash - 如何从 df 命令获取挂载磁盘的名称
- html - Bootstrap 4导航栏搜索框未在中心对齐