簡體   English   中英

r中的指數衰減擬合

[英]Exponential decay fit in r

我想將R中的指數衰減函數擬合到以下數據:

data <- structure(list(x = 0:38, y = c(0.991744340878828, 0.512512332368168, 
0.41102449265681, 0.356621905557202, 0.320851602373477, 0.29499198506227, 
0.275037747162642, 0.25938850981822, 0.245263623938863, 0.233655093612007, 
0.224041426946405, 0.214152907133301, 0.207475138903635, 0.203270738895484, 
0.194942528735632, 0.188107106969046, 0.180926819430008, 0.177028560207711, 
0.172595416846822, 0.166729221891201, 0.163502461048814, 0.159286528409165, 
0.156110097827889, 0.152655498715612, 0.148684858095915, 0.14733605355542, 
0.144691873223729, 0.143118852619617, 0.139542186417186, 0.137730138713745, 
0.134353615271572, 0.132197800438632, 0.128369567159113, 0.124971834736476, 
0.120027536018095, 0.117678812415655, 0.115720611113327, 0.112491329844252, 
0.109219168085624)), class = "data.frame", row.names = c(NA, 
-39L), .Names = c("x", "y"))

我嘗試過使用nls進行擬合,但是生成的曲線與實際數據不接近。

在此處輸入圖片說明

如果有人可以解釋如何使用此類非線性數據並找到最合適的函數,那將非常有幫助。

嘗試y ~ .lin / (b + x^c) 請注意,當使用"plinear"時,在將公式指定為nls時,它會省略.lin線性參數,並且還會為其省略起始值。

還要注意, .linb參數在最佳狀態下約為1,因此我們也可以嘗試一個參數模型y ~ 1 / (1 + x^c) 這是單參數對數邏輯生存曲線的形式。 此一參數模型的AIC比三參數模型的AIC(fm1)差(比較AIC(fm1)AIC(fm3) ),但由於其簡約性以及擬合度與視覺上無法區分的事實,一個參數模型可能仍然是更可取的3參數模型。

opar <- par(mfcol = 2:1, mar = c(3, 3, 3, 1), family = "mono")

# data = data.frame with x & y col names; fm = model fit; main = string shown above plot
Plot <- function(data, fm, main) {
  plot(y ~ x, data, pch = 20)
  lines(fitted(fm) ~ x, data, col = "red")
  legend("topright", bty = "n", cex = 0.7, legend = capture.output(fm))
  title(main = paste(main, "- AIC:", round(AIC(fm), 2)))
}  

# 3 parameter model
fo3 <- y ~ 1/(b + x^c) # omit .lin parameter; plinear will add it automatically
fm3 <- nls(fo3, data = data, start = list(b = 1, c = 1), alg = "plinear")
Plot(data, fm3, "3 parameters")

# one parameter model
fo1 <- y ~ 1 / (1 + x^c)
fm1 <- nls(fo1, data, start = list(c = 1))
Plot(data, fm1, "1 parameter")

par(read.only = opar)

截圖

AIC

在其他答案中添加解決方案,我們可以比較AIC值。 我們已經通過每個解決方案使用的參數數量對其進行了標記(自由度將是一個更大的自由度),並且已經對數對數解決方案進行了重新設計以使用nls代替lm並且LHS為y,因為一個人無法比較AIC由於所使用的對數似然常數可能不同,因此具有不同左側或使用不同優化例程的模型的值可能會不同。

fo2 <- y ~ exp(a + b * log(x+1))
fm2 <- nls(fo2, data, start = list(a = 1, b = 1))

fo4 <- y ~ SSbiexp(x, A1, lrc1, A2, lrc2)
fm4 <- nls(fo4, data)

aic <- AIC(fm1, fm2, fm3, fm4)
aic[order(aic$AIC), ]

從最佳AIC(例如fm3)到最差AIC(例如fm2):

    df     AIC
fm3  4 -329.35
fm1  2 -307.69
fm4  5 -215.96
fm2  3 -167.33
data <- structure(list(x = 0:38, y = c(0.991744340878828, 0.512512332368168, 
0.41102449265681, 0.356621905557202, 0.320851602373477, 0.29499198506227, 
0.275037747162642, 0.25938850981822, 0.245263623938863, 0.233655093612007, 
0.224041426946405, 0.214152907133301, 0.207475138903635, 0.203270738895484, 
0.194942528735632, 0.188107106969046, 0.180926819430008, 0.177028560207711, 
0.172595416846822, 0.166729221891201, 0.163502461048814, 0.159286528409165, 
0.156110097827889, 0.152655498715612, 0.148684858095915, 0.14733605355542, 
0.144691873223729, 0.143118852619617, 0.139542186417186, 0.137730138713745, 
0.134353615271572, 0.132197800438632, 0.128369567159113, 0.124971834736476, 
0.120027536018095, 0.117678812415655, 0.115720611113327, 0.112491329844252, 
0.109219168085624)), class = "data.frame", row.names = c(NA, 
-39L), .Names = c("x", "y"))

# Do this because the log of 0 is not possible to calculate
data$x = data$x +1

fit = lm(log(y) ~ log(x), data = data)
plot(data$x, data$y)
lines(data$x, data$x ^ fit$coefficients[2], col = "red")

這比使用nls forumla更好。 當繪制擬合時,效果似乎還不錯。

雙指數模型更適合,盡管仍不完美。 這表明您可能同時有兩個衰減過程。

fit <- nls(y ~ SSbiexp(x, A1, lrc1, A2, lrc2), data = data)
#A1*exp(-exp(lrc1)*x)+A2*exp(-exp(lrc2)*x)

plot(y ~x, data = data)
curve(predict(fit, newdata = data.frame(x)), add = TRUE)

結果圖

如果測量誤差取決於幅度,則可以考慮將其用於加權。

但是,您應該仔細考慮從您的領域知識中期望什么樣的模型。 僅憑經驗選擇非線性模型通常不是一個好主意。 非參數擬合可能是一個更好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM