R

使用 R 的 nls() 進行變化點分析

  • February 23, 2011

我正在嘗試使用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)),有很多局部最大值取決於您給出的初始參數值。我想如果您想認真對待這一點,您會使用隨機初始參數多次調用優化器並檢查結果的分佈。

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

comments powered by Disqus