非线性回归,nls,R中:奇异梯度
Non-linear regression, nls, in R: singular gradient
我想将我的数据拟合到已使用 Matlab 优化的特定函数。
我收到以下错误:
'警告信息:
stat_smooth()
计算失败:
奇异梯度'
请帮忙!这是我的 R 代码:
tibble
x y SEM
1 1 0.0342 0.00532
2 3 0.0502 0.00639
3 5 0.0700 0.0118
4 10 0.123 0.0269
5 20 0.154 0.0125
6 30 0.203 0.0190
7 40 0.257 0.0255
8 50 0.287 0.0266
9 60 0.345 0.0347
10 90 0.442 0.0398
11 120 0.569 0.0570
12 180 0.726 0.0406
13 240 0.824 0.0150
14 360 0.868 0.00821
15 1440 0.890 0.0246
tibble %>%
ggplot(aes(x, y)) +
geom_point()+
geom_errorbar(aes(ymin=y-SEM, ymax=y+SEM), width=25)+
geom_ribbon(aes(ymin = y-2.575*SEM, ymax = y+2.575*SEM), alpha = 0.1)+
geom_smooth(method="nls",
formula= y ~ (1-((k2/(k2-k1))*exp(-k1*x))+((k1/(k2-k1))*exp(-k2*x))),
se=F,
method.args = list(start=list(k1=0.006999, k2=849.6)))
就目前而言,nls
无法确定 k2 的最佳值,因为随着 k2 趋于无穷大,平方和逐渐减小到大约 0.0225 的值。因此,不存在最小化平方和的有限 k2 值。由于 k2 趋于无穷大,它有效地抵消了,使公式等价于:
y ~ 1 - exp(-k1*x)
这意味着对于任何有限的 k2 值,此公式始终比原始公式更适合数据。
简而言之,k2 是一个多余的参数,只会使您的合身性变差。
因此您的情节可以这样制作:
ggplot(df, aes(x, y)) +
geom_point() +
geom_errorbar(aes(ymin = y - SEM, ymax = y + SEM), width = 25) +
geom_ribbon(aes(ymin = y - 2.575 * SEM, ymax = y + 2.575 * SEM), alpha = 0.1) +
geom_smooth(method = "nls",
formula = y ~ 1 - exp(-k1 * x),
se = FALSE,
method.args = list(start = list(k1 = 0.006999)))
或者,正如 G. Grothendieck 建议的那样,使用一个额外的参数来像这样优化拟合(假设它在您的用例中具有物理意义)
ggplot(df, aes(x, y)) +
geom_point() +
geom_errorbar(aes(ymin = y - SEM, ymax = y + SEM), width = 25) +
geom_ribbon(aes(ymin = y - 2.575 * SEM, ymax = y + 2.575 * SEM), alpha = 0.1) +
geom_smooth(method = "nls",
formula = y ~ k2 * (1 - exp(-k1 * x)),
se = FALSE,
method.args = list(start = list(k1 = 0.006999, k2 = 1)))
我想将我的数据拟合到已使用 Matlab 优化的特定函数。
我收到以下错误:
'警告信息:
stat_smooth()
计算失败:
奇异梯度'
请帮忙!这是我的 R 代码:
tibble
x y SEM
1 1 0.0342 0.00532
2 3 0.0502 0.00639
3 5 0.0700 0.0118
4 10 0.123 0.0269
5 20 0.154 0.0125
6 30 0.203 0.0190
7 40 0.257 0.0255
8 50 0.287 0.0266
9 60 0.345 0.0347
10 90 0.442 0.0398
11 120 0.569 0.0570
12 180 0.726 0.0406
13 240 0.824 0.0150
14 360 0.868 0.00821
15 1440 0.890 0.0246
tibble %>%
ggplot(aes(x, y)) +
geom_point()+
geom_errorbar(aes(ymin=y-SEM, ymax=y+SEM), width=25)+
geom_ribbon(aes(ymin = y-2.575*SEM, ymax = y+2.575*SEM), alpha = 0.1)+
geom_smooth(method="nls",
formula= y ~ (1-((k2/(k2-k1))*exp(-k1*x))+((k1/(k2-k1))*exp(-k2*x))),
se=F,
method.args = list(start=list(k1=0.006999, k2=849.6)))
就目前而言,nls
无法确定 k2 的最佳值,因为随着 k2 趋于无穷大,平方和逐渐减小到大约 0.0225 的值。因此,不存在最小化平方和的有限 k2 值。由于 k2 趋于无穷大,它有效地抵消了,使公式等价于:
y ~ 1 - exp(-k1*x)
这意味着对于任何有限的 k2 值,此公式始终比原始公式更适合数据。
简而言之,k2 是一个多余的参数,只会使您的合身性变差。
因此您的情节可以这样制作:
ggplot(df, aes(x, y)) +
geom_point() +
geom_errorbar(aes(ymin = y - SEM, ymax = y + SEM), width = 25) +
geom_ribbon(aes(ymin = y - 2.575 * SEM, ymax = y + 2.575 * SEM), alpha = 0.1) +
geom_smooth(method = "nls",
formula = y ~ 1 - exp(-k1 * x),
se = FALSE,
method.args = list(start = list(k1 = 0.006999)))
或者,正如 G. Grothendieck 建议的那样,使用一个额外的参数来像这样优化拟合(假设它在您的用例中具有物理意义)
ggplot(df, aes(x, y)) +
geom_point() +
geom_errorbar(aes(ymin = y - SEM, ymax = y + SEM), width = 25) +
geom_ribbon(aes(ymin = y - 2.575 * SEM, ymax = y + 2.575 * SEM), alpha = 0.1) +
geom_smooth(method = "nls",
formula = y ~ k2 * (1 - exp(-k1 * x)),
se = FALSE,
method.args = list(start = list(k1 = 0.006999, k2 = 1)))