Thay đổi phân tích điểm bằng cách sử dụng R's nls ()


15

Tôi đang cố gắng thực hiện phân tích "điểm thay đổi" hoặc hồi quy đa pha bằng cách sử dụng nls()trong R.

Đây là một số dữ liệu giả mạo tôi đã thực hiện . Công thức tôi muốn sử dụng để phù hợp với dữ liệu là:

y=β0+β1x+β2max(0,xδ)

Điều này được cho là phù hợp với dữ liệu đến một điểm nhất định với một mức chặn và độ dốc nhất định ( và ), sau đó, sau một giá trị x nhất định ( \ delta ), tăng độ dốc thêm \ beta_2 . Đó là những gì toàn bộ điều tối đa là về. Trước điểm \ delta , nó sẽ bằng 0 và \ beta_2 sẽ bị xóa.β0β1δβ2δβ2

Vì vậy, đây là chức năng của tôi để làm điều này:

changePoint <- function(x, b0, slope1, slope2, delta){ 
   b0 + (x*slope1) + (max(0, x-delta) * slope2)
}

Và tôi cố gắng để phù hợp với mô hình theo cách này

nls(y ~ changePoint(x, b0, slope1, slope2, delta), 
    data = data, 
    start = c(b0 = 50, slope1 = 0, slope2 = 2, delta = 48))

Tôi đã chọn các tham số bắt đầu đó, vì tôi biết đó là các tham số bắt đầu, vì tôi đã tạo ra dữ liệu.

Tuy nhiên, tôi nhận được lỗi này:

Error in nlsModel(formula, mf, start, wts) : 
  singular gradient matrix at initial parameter estimates

Có phải tôi vừa làm dữ liệu không may? Tôi đã thử điều chỉnh dữ liệu này trên dữ liệu thực trước tiên và nhận được cùng một lỗi và tôi chỉ nhận ra rằng các tham số ban đầu ban đầu của tôi không đủ tốt.

Câu trả lời:


12

(Lúc đầu, tôi nghĩ rằng nó có thể là một vấn đề do thực tế maxkhông phải là véc tơ, nhưng điều đó không đúng. Điều đó làm cho nó trở nên khó khăn khi làm việc với ChangePoint, trong đó có sửa đổi sau:

changePoint <- function(x, b0, slope1, slope2, delta) { 
   b0 + (x*slope1) + (sapply(x-delta, function (t) max(0, t)) * slope2)
}

Bài đăng danh sách gửi thư trợ giúp R ​​này mô tả một cách mà lỗi này có thể xảy ra: rhs của công thức được định lượng quá mức, sao cho việc thay đổi hai tham số song song sẽ phù hợp với dữ liệu. Tôi không thể thấy điều đó đúng với mô hình của bạn, nhưng có lẽ nó là như vậy.

Trong mọi trường hợp, bạn có thể viết hàm mục tiêu của riêng bạn và giảm thiểu nó. Hàm sau đưa ra lỗi bình phương cho các điểm dữ liệu (x, y) và một giá trị nhất định của các tham số (cấu trúc đối số kỳ lạ của hàm là để tính toán cách thức optimhoạt động):

sqerror <- function (par, x, y) {
  sum((y - changePoint(x, par[1], par[2], par[3], par[4]))^2)
}

Sau đó, chúng tôi nói:

optim(par = c(50, 0, 2, 48), fn = sqerror, x = x, y = data)

Và nhìn thấy:

$par
[1] 54.53436800 -0.09283594  2.07356459 48.00000006

Lưu ý rằng đối với dữ liệu giả mạo của tôi ( x <- 40:60; data <- changePoint(x, 50, 0, 2, 48) + rnorm(21, 0, 0.5)) có rất nhiều cực đại cục bộ tùy thuộc vào các giá trị tham số ban đầu bạn đưa ra. Tôi cho rằng nếu bạn muốn thực hiện điều này một cách nghiêm túc, bạn sẽ gọi trình tối ưu hóa nhiều lần với các tham số ban đầu ngẫu nhiên và kiểm tra phân phối kết quả.


Bài đăng này của Bill Venables giải thích tốt các vấn đề liên quan đến loại phân tích này.
Aaron

6
Thay vì gọi (rườm rà) một cách khéo léo trong đoạn mã đầu tiên của bạn, bạn luôn có thể sử dụng pmax .
hồng y
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.