Lấy giá trị bắt đầu đúng cho mô hình nls trong R


12

Tôi đang cố gắng điều chỉnh một mô hình luật công suất đơn giản cho một tập dữ liệu như sau:

mydf:

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

Mục tiêu là để vượt qua đường dây điện thông qua và sử dụng nó để dự đoán revvlaues trong những tuần tới. Một loạt các nghiên cứu đã dẫn tôi đến nlschức năng, mà tôi thực hiện như sau.

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)))

Trong khi điều này hoạt động cho một lmmô hình, tôi gặp một singular gradientlỗi, mà tôi hiểu là phải làm với các giá trị bắt đầu của tôi ab. Tôi đã thử các giá trị khác nhau, thậm chí đi xa hơn để vẽ biểu đồ này trong Excel, vượt qua một mình, nhận phương trình, sau đó sử dụng các giá trị từ phương trình, nhưng tôi vẫn gặp lỗi. Tôi đã xem một loạt các câu trả lời như thế này và thử câu trả lời thứ hai (không thể hiểu câu trả lời thứ nhất), nhưng không có kết quả.

Tôi thực sự có thể sử dụng một số trợ giúp ở đây về cách tìm các giá trị bắt đầu đúng. Hoặc cách khác, tôi có thể sử dụng chức năng nào khác thay vì nls.

Trong trường hợp bạn muốn tạo lại mydfmột cách dễ dàng:

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)) 

1
Mặc dù được nêu theo thuật ngữ R (nó thực sự phải được nói bằng một số ngôn ngữ), làm thế nào để tìm các giá trị bắt đầu phù hợp cho mô hình phi tuyến tính phù hợp đủ để được đưa vào chủ đề ở đây, IMO. Nó không thực sự là một chương trình Q, vd.
gung - Phục hồi Monica

Câu trả lời:


13

Đây là một vấn đề phổ biến với các mô hình bình phương nhỏ nhất phi tuyến; nếu các giá trị bắt đầu của bạn ở rất xa mức tối ưu, thuật toán có thể không hội tụ, mặc dù nó có thể được xử lý tốt gần mức tối ưu.

Nếu bạn bắt đầu bằng cách lấy nhật ký của cả hai bên và khớp với mô hình tuyến tính, bạn sẽ có được ước tính và là độ dốc và đánh chặn (9.947 và -2.011) (chỉnh sửa: đó là nhật ký tự nhiên)blog(a)b

Nếu bạn sử dụng chúng để hướng dẫn các giá trị bắt đầu cho và mọi thứ dường như hoạt động tốt:bab

 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

Điều đó cực kỳ hữu ích, cảm ơn bạn rất nhiều! Tôi có một câu hỏi về cách bạn có giá trị "a" của bạn ở đây mặc dù. Tôi đã thử chạy lm (log10 (rev) ~ log10 (tuần)) và sau đó sử dụng chức năng "tóm tắt" và trong khi tôi nhận được cùng một giá trị "b", giá trị "a" của tôi xuất hiện đến 4.3201. Bạn đã làm gì khác nhau để đến a = 9,947?
NeonBlueHair

Lưu ý rằng tôi đã sử dụng expđể đưa nó trở lại các giá trị chưa được lưu, đó là một đầu mối chỉ ra rằng tôi đã sử dụng loghàm đơn giản . Miễn là bạn phù hợp với nhật ký và bản sao bạn sử dụng, bạn sẽ nhận được câu trả lời tương tự cho giá trị bắt đầu. Vì vậy, bạn có thể làm cơ sở 10 và tôi có thể làm cơ sở và mọi thứ đều giống nhau. e
Glen_b -Reinstate Monica

Ah, bạn hoàn toàn đúng. Lỗi nghiệp dư về phía tôi. Giữ suy nghĩ về ký hiệu toán học mong đợi "log" có nghĩa là cơ sở log 10 và "ln" cho log tự nhiên. Cảm ơn bạn đã làm rõ.
NeonBlueHair

1
Đối với nhiều nhà toán học (và nhiều nhà thống kê), một "nhật ký" chưa được cung cấp là nhật ký tự nhiên, giống như một cuộc tranh luận chưa được giải thích đối với một hàm tội lỗi là bằng radian. [Chẳng hạn, các quy ước xung đột có thể dẫn đến nhầm lẫn, nhưng khi tôi bắt đầu sử dụng R, chẳng hạn, tôi đã không nghĩ hai lần về việc sử dụng chức năng đăng nhập vì R và tôi có chung quy ước.]
Glen_b -Reinstate Monica

4

Thử

 newMod <- nls(rev ~ a*weeks^b, data=mydf, startlist(a=17919.2127344,b=-1.76270557120))

Tôi đã được yêu cầu mở rộng câu trả lời này một chút. Vấn đề này rất đơn giản Tôi hơi ngạc nhiên khi nls thất bại. Tuy nhiên, vấn đề thực sự là với toàn bộ cách tiếp cận R và triết lý của mô hình phi tuyến phù hợp. Trong thế giới thực, người ta sẽ chia tỷ lệ x để nằm giữa -1 và 1 và y và y nằm giữa 0 an 1 (y = ax ^ b). Điều đó có lẽ là đủ để có được nls để hội tụ. Tất nhiên như Glen chỉ ra bạn có thể phù hợp với mô hình log-linear tương ứng. Điều đó phụ thuộc vào thực tế là tồn tại một phép biến đổi đơn giản giúp tuyến tính hóa mô hình. Đó thường không phải là trường hợp. Vấn đề với các thói quen R như nls là chúng không cung cấp hỗ trợ cho việc xác định lại mô hình. Trong trường hợp này, việc xác định lại thông số là đơn giản, chỉ cần bán lại / Recentre x và y. Tuy nhiên, khi phù hợp với mô hình, người dùng sẽ có các tham số a và b khác với các tham số ban đầu. Mặc dù rất đơn giản để tính toán những cái ban đầu từ những cái này, nhưng khó khăn khác là nói chung không đơn giản để có được độ lệch chuẩn ước tính cho các ước tính tham số này. Điều này được thực hiện bằng phương pháp delta liên quan đến Hessian về khả năng đăng nhập và một số dẫn xuất. Phần mềm ước tính tham số phi tuyến sẽ tự động cung cấp các tính toán này, do đó việc tái xác định tham số của mô hình được hỗ trợ dễ dàng. Một điều nữa mà phần mềm nên hỗ trợ là khái niệm về các pha. Bạn có thể nghĩ đến việc lắp mô hình đầu tiên với phiên bản của Glen là giai đoạn 1. Mô hình "thực" phù hợp với giai đoạn 2. khó khăn khác là nói chung không đơn giản để có được độ lệch chuẩn ước tính cho các ước tính tham số này. Điều này được thực hiện bằng phương pháp delta liên quan đến Hessian về khả năng đăng nhập và một số dẫn xuất. Phần mềm ước tính tham số phi tuyến sẽ tự động cung cấp các tính toán này, do đó việc tái xác định tham số của mô hình được hỗ trợ dễ dàng. Một điều nữa mà phần mềm nên hỗ trợ là khái niệm về các pha. Bạn có thể nghĩ đến việc lắp mô hình đầu tiên với phiên bản của Glen là giai đoạn 1. Mô hình "thực" phù hợp với giai đoạn 2. khó khăn khác là nói chung không đơn giản để có được độ lệch chuẩn ước tính cho các ước tính tham số này. Điều này được thực hiện bằng phương pháp delta liên quan đến Hessian về khả năng đăng nhập và một số dẫn xuất. Phần mềm ước tính tham số phi tuyến sẽ tự động cung cấp các tính toán này, do đó việc tái xác định tham số của mô hình được hỗ trợ dễ dàng. Một điều nữa mà phần mềm nên hỗ trợ là khái niệm về các pha. Bạn có thể nghĩ đến việc lắp mô hình đầu tiên với phiên bản của Glen là giai đoạn 1. Mô hình "thực" phù hợp với giai đoạn 2. Phần mềm ước tính tham số phi tuyến sẽ tự động cung cấp các tính toán này, do đó việc tái xác định tham số của mô hình được hỗ trợ dễ dàng. Một điều nữa mà phần mềm nên hỗ trợ là khái niệm về các pha. Bạn có thể nghĩ đến việc lắp mô hình đầu tiên với phiên bản của Glen là giai đoạn 1. Mô hình "thực" phù hợp với giai đoạn 2. Phần mềm ước tính tham số phi tuyến sẽ tự động cung cấp các tính toán này, do đó việc tái xác định tham số của mô hình được hỗ trợ dễ dàng. Một điều nữa mà phần mềm nên hỗ trợ là khái niệm về các pha. Bạn có thể nghĩ đến việc lắp mô hình đầu tiên với phiên bản của Glen là giai đoạn 1. Mô hình "thực" phù hợp với giai đoạn 2.

Tôi phù hợp với mô hình của bạn với AD Model Builder hỗ trợ các pha theo cách tự nhiên. Trong giai đoạn đầu chỉ có một ước tính. Điều này có được mô hình của bạn vào sân bóng. Trong giai đoạn thứ hai a và b được ước tính để có được giải pháp. AD Model Builder tự động tính toán độ lệch chuẩn cho bất kỳ chức năng nào của các tham số mô hình thông qua phương thức delta để nó khuyến khích việc xác định lại ổn định của mô hình.


2

Thuật toán Levenberg-Marquest có thể giúp:

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

require(minpack.lm)
fit <- nlsLM(rev ~ a*weeks^b, data=modeldf, start = list(a=1,b=1))

require(broom)
fit_data <- augment(fit)

plot(.fitted~rev, data=fit_data)

1

Theo kinh nghiệm của tôi, một cách tốt để tìm giá trị khởi đầu cho các tham số của mô hình NLR là sử dụng thuật toán tiến hóa. Từ một dân số ban đầu (100) ước tính ngẫu nhiên (cha mẹ) trong không gian tìm kiếm, chọn 20 (con cái) tốt nhất và sử dụng chúng để giúp xác định tìm kiếm trong một quần thể thành công. Lặp lại cho đến khi hội tụ. Không cần độ dốc hoặc hessian, chỉ cần đánh giá SSE. Nếu bạn không quá tham lam thì điều này rất thường xuyên hoạt động. Vấn đề mà mọi người thường gặp là họ đang sử dụng một tìm kiếm địa phương (Newton-Raphson) để thực hiện công việc tìm kiếm toàn cầu. Như mọi khi, đó là vấn đề sử dụng công cụ chính xác cho công việc trong tay. Sẽ hợp lý hơn khi sử dụng tìm kiếm toàn cầu EA để tìm các giá trị bắt đầu cho tìm kiếm cục bộ Newton, và sau đó để điều này giảm xuống mức tối thiểu. Nhưng, như với tất cả mọi thứ, ma quỷ là chi tiết.

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.