R
使用 R 的 nls() 進行變化點分析
我正在嘗試使用
nls()
R實現“變化點”分析或多相回歸。這是我製作的一些假數據。我想用來擬合數據的公式是:
這應該做的是將數據擬合到具有一定截距和斜率的特定點(和),然後,在某個 x 值 (),增加斜率. 這就是整個 max 的意義所在。之前點,它將等於 0,並且將被歸零。
所以,這是我的功能:
changePoint <- function(x, b0, slope1, slope2, delta){ b0 + (x*slope1) + (max(0, x-delta) * slope2) }
我嘗試以這種方式擬合模型
nls(y ~ changePoint(x, b0, slope1, slope2, delta), data = data, start = c(b0 = 50, slope1 = 0, slope2 = 2, delta = 48))
我選擇了那些起始參數,因為我知道那些是起始參數,因為我做了數據。
但是,我收到此錯誤:
Error in nlsModel(formula, mf, start, wts) : singular gradient matrix at initial parameter estimates
我剛剛製作了不幸的數據嗎?我首先嘗試在真實數據上進行擬合,並且得到了同樣的錯誤,我只是認為我的初始啟動參數不夠好。
(起初我認為這可能是由於
max
未矢量化而導致的問題,但事實並非如此。使用 changePoint確實很痛苦,因此進行了以下修改:changePoint <- function(x, b0, slope1, slope2, delta) { b0 + (x*slope1) + (sapply(x-delta, function (t) max(0, t)) * slope2) }
此 R-help 郵件列表帖子描述了可能導致此錯誤的一種方式:公式的 rhs 被過度參數化,因此同時更改兩個參數可以使數據具有相同的擬合度。我看不出你的模型是怎樣的,但也許是這樣。
在任何情況下,您都可以編寫自己的目標函數並將其最小化。下面的函數給出了數據點 (x,y) 的平方誤差和參數的某個值(函數的奇怪參數結構是為了說明如何
optim
工作):sqerror <- function (par, x, y) { sum((y - changePoint(x, par[1], par[2], par[3], par[4]))^2) }
然後我們說:
optim(par = c(50, 0, 2, 48), fn = sqerror, x = x, y = data)
並看到:
$par [1] 54.53436800 -0.09283594 2.07356459 48.00000006
請注意,對於我的假數據 (
x <- 40:60; data <- changePoint(x, 50, 0, 2, 48) + rnorm(21, 0, 0.5)
),有很多局部最大值取決於您給出的初始參數值。我想如果您想認真對待這一點,您會使用隨機初始參數多次調用優化器並檢查結果的分佈。