R
在 R 中為 nls 模型獲取正確的起始值
我正在嘗試將一個簡單的冪律模型擬合到如下數據集:
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
錯誤,我知道這與我的起始值a
和b
. 我嘗試了不同的值,甚至在 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