我想將我的資料擬合到已經使用 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)))
uj5u.com熱心網友回復:
就目前而言,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)))

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/358898.html
