R

在 R 中為 nls 模型獲取正確的起始值

  • November 26, 2015

我正在嘗試將一個簡單的冪律模型擬合到如下數據集:

mydf:

rev     weeks
17906.4 1
5303.72 2
2700.58 3
1696.77 4
947.53  5
362.03  6

目標是讓電力線通過並用它來預測rev未來幾週的價值。一堆研究使我找到了該nls功能,我實現如下。

newMod <- nls(rev ~ a*weeks^b, data=modeldf, start = list(a=1,b=1))
predict(newMod, newdata = data.frame(weeks=c(1,2,3,4,5,6,7,8,9,10)))

雖然這適用於lm模型,但我得到一個singular gradient錯誤,我知道這與我的起始值ab. 我嘗試了不同的值,甚至在 Excel 中繪製它,單獨傳遞,得到一個方程,然後使用方程中的值,但我仍然得到錯誤。我看了一堆像這樣的答案並嘗試了第二個答案(無法理解第一個),但沒有結果。

關於如何找到正確的起始值,我真的可以在這裡使用一些幫助。或者,我可以使用什麼其他功能代替 nls。

如果您想mydf輕鬆重新創建:

mydf <- data.frame(rev=c(17906.4, 5303.72, 2700.58 ,1696.77 ,947.53 ,362.03), weeks=c(1,2,3,4,5,6)) 

這是非線性最小二乘模型的常見問題;如果您的起始值與最優值相差甚遠,則算法可能不會收斂,即使它可能在最優值附近表現良好。

如果你從兩邊的對數開始並擬合一個線性模型,你會得到和作為斜率和截距( 9.947 和 -2.011 )(編輯:這是自然對數)

如果您使用這些來指導起始值和一切似乎都正常:

newMod <- nls(rev ~ a*weeks^b, data=mydf, start = list(a=exp(9.947),b=-2.011))
predict(newMod, newdata = data.frame(weeks=c(1,2,3,4,5,6,7,8,9,10)))
[1] 17919.2138  5280.7001  2584.0109  1556.1951  1050.1230   761.4947   580.3091   458.6027
[9]   372.6231   309.4658

引用自:https://stats.stackexchange.com/questions/183653

comments powered by Disqus