Mendapatkan nilai awal yang benar untuk model nls di R

12

Saya mencoba menyesuaikan model hukum kekuasaan yang sederhana dengan kumpulan data yaitu sebagai berikut:

mydf:

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

Tujuannya adalah untuk melewati saluran listrik dan menggunakannya untuk memprediksi revvlaues untuk minggu mendatang. Banyak penelitian telah membawa saya ke nlsfungsi, yang saya terapkan sebagai berikut.

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

Meskipun ini berfungsi untuk lmmodel, saya mendapatkan singular gradientkesalahan, yang saya pahami terkait dengan nilai awal adan b. Saya mencoba nilai yang berbeda, bahkan sampai sejauh ini untuk plot ini di Excel, lulus sendirian, mendapatkan persamaan, lalu menggunakan nilai dari persamaan, tetapi saya masih mendapatkan kesalahan. Saya melihat banyak jawaban seperti ini dan mencoba jawaban kedua (tidak bisa mengerti yang pertama), tetapi tidak membuahkan hasil.

Saya benar-benar dapat menggunakan bantuan di sini tentang cara menemukan nilai awal yang tepat. Atau sebagai alternatif, fungsi lain apa yang bisa saya gunakan sebagai ganti nls.

Jika Anda ingin membuat ulang mydfdengan mudah:

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)) 
NeonBlueHair
sumber
1
Meskipun dinyatakan dalam istilah R (itu benar-benar harus dinyatakan dalam beberapa bahasa), bagaimana menemukan nilai awal yang sesuai untuk model non-linear cocok cukup statistik untuk menjadi topik di sini, IMO. Ini bukan Q pemrograman, misalnya.
gung - Reinstate Monica

Jawaban:

13

Ini adalah masalah umum dengan model kuadrat nonlinier; jika nilai awal Anda sangat jauh dari optimal, algoritme mungkin tidak menyatu, meskipun mungkin berperilaku baik di dekat optimal.

Jika Anda mulai dengan mengambil log dari kedua sisi dan cocok dengan model linier, Anda mendapatkan estimasi dan sebagai kemiringan dan intersep (9.947 dan -2.011) (edit: itu log natural)bcatatan(Sebuah)b

Jika Anda menggunakannya untuk memandu nilai awal untuk dan semuanya tampaknya berfungsi dengan baik:bSebuahb

 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
Glen_b -Reinstate Monica
sumber
Itu sangat membantu, terima kasih banyak! Saya punya pertanyaan tentang bagaimana Anda mendapat nilai "a" di sini. Saya mencoba menjalankan lm (log10 (rev) ~ log10 (minggu)) dan kemudian menggunakan fungsi "ringkasan", dan sementara saya mendapatkan nilai "b" yang sama, nilai "a" saya keluar ke 4.3201. Apa yang Anda lakukan secara berbeda untuk sampai pada a = 9,947?
NeonBlueHair
exploge
Ah, kamu benar sekali. Kesalahan amatir di pihak saya. Terus memikirkan notasi matematika yang mengharapkan "log" berarti log basis 10 dan "ln" untuk log natural. Terimakasih atas klarifikasinya.
NeonBlueHair
1
Bagi banyak ahli matematika (dan banyak ahli statistik), "log" tanpa hiasan adalah log natural, sama seperti argumen tanpa hiasan tentang fungsi dosa ada dalam radian. [Konvensi yang berbenturan dapat menyebabkan kebingungan, sayangnya, tetapi ketika saya mulai menggunakan R, misalnya, saya tidak berpikir dua kali tentang penggunaan fungsi log sejak R dan saya berbagi konvensi yang sama.]
Glen_b -Reinstate Monica
4

Mencoba

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

Saya diminta sedikit memperluas jawaban ini. Masalah ini sangat sederhana, saya agak terkejut bahwa NSL gagal melakukannya. Namun masalah sebenarnya adalah dengan seluruh pendekatan R dan filosofi pemasangan model nonlinier. Dalam dunia nyata seseorang akan skala x untuk berbohong antara -1 dan 1 dan y dan y untuk berbohong antara 0 dan 1 (y = ax ^ b). Itu mungkin akan cukup untuk membuat nls bertemu. Tentu saja seperti yang ditunjukkan Glen, Anda dapat menggunakan model log-linear yang sesuai. Itu bergantung pada kenyataan bahwa ada transformasi sederhana yang linierisasi model. Itu sering tidak terjadi. Masalah dengan rutin R seperti nls adalah bahwa mereka tidak menawarkan dukungan untuk reparameterisasi model. Dalam hal ini reparameterisasi sederhana, hanya skala ulang / baru-baru ini x dan y. Namun setelah sesuai dengan model, pengguna akan memiliki parameter a dan b yang berbeda dari yang asli. Meskipun sederhana untuk menghitung yang asli dari ini, kesulitan lainnya adalah tidak begitu sederhana secara umum untuk mendapatkan estimasi standar deviasi untuk estimasi parameter ini. Ini dilakukan dengan metode delta yang melibatkan Hessian dari log-likelihood dan beberapa turunannya. Perangkat lunak estimasi parameter nonlinear harus memasok perhitungan ini secara otomatis, sehingga reparameterisasi model mudah didukung. Hal lain yang harus didukung oleh perangkat lunak adalah gagasan tentang fase. Anda dapat memikirkan untuk menyesuaikan model dengan versi Glen sebagai fase 1. Model "asli" sesuai pada tahap 2. kesulitan lainnya adalah tidak semudah itu secara umum untuk mendapatkan estimasi standar deviasi untuk estimasi parameter ini. Ini dilakukan dengan metode delta yang melibatkan Hessian dari log-likelihood dan beberapa turunannya. Perangkat lunak estimasi parameter nonlinear harus memasok perhitungan ini secara otomatis, sehingga reparameterisasi model mudah didukung. Hal lain yang harus didukung oleh perangkat lunak adalah gagasan tentang fase. Anda dapat memikirkan untuk menyesuaikan model dengan versi Glen sebagai fase 1. Model "asli" sesuai pada tahap 2. kesulitan lainnya adalah tidak semudah itu secara umum untuk mendapatkan estimasi standar deviasi untuk estimasi parameter ini. Ini dilakukan dengan metode delta yang melibatkan Hessian dari log-likelihood dan beberapa turunannya. Perangkat lunak estimasi parameter nonlinear harus memasok perhitungan ini secara otomatis, sehingga reparameterisasi model mudah didukung. Hal lain yang harus didukung oleh perangkat lunak adalah gagasan tentang fase. Anda dapat memikirkan untuk menyesuaikan model dengan versi Glen sebagai fase 1. Model "asli" sesuai pada tahap 2. Perangkat lunak estimasi parameter nonlinear harus memasok perhitungan ini secara otomatis, sehingga reparameterisasi model mudah didukung. Hal lain yang harus didukung oleh perangkat lunak adalah gagasan tentang fase. Anda dapat memikirkan untuk menyesuaikan model dengan versi Glen sebagai fase 1. Model "asli" sesuai pada tahap 2. Perangkat lunak estimasi parameter nonlinear harus memasok perhitungan ini secara otomatis, sehingga reparameterisasi model mudah didukung. Hal lain yang harus didukung oleh perangkat lunak adalah gagasan tentang fase. Anda dapat memikirkan untuk menyesuaikan model dengan versi Glen sebagai fase 1. Model "asli" sesuai pada tahap 2.

Saya cocok dengan model Anda dengan AD Model Builder yang mendukung fase secara alami. Pada fase pertama hanya diperkirakan. Ini membawa model Anda ke stadion baseball. Pada fase kedua a dan b diperkirakan mendapatkan solusinya. Pembuat Model AD secara otomatis menghitung standar deviasi untuk setiap fungsi parameter model melalui metode delta sehingga mendorong reparameterisasi model yang stabil.

dave fournier
sumber
2

Algoritma Levenberg-Marquardt dapat membantu:

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)
Etienne Low-Décarie
sumber
1

Dalam pengalaman saya, cara yang baik untuk menemukan nilai awal untuk parameter model NLR adalah dengan menggunakan algoritma evolusi. Dari populasi awal (100) dari perkiraan acak (orang tua) di ruang pencarian pilih 20 terbaik (keturunan) dan gunakan ini untuk membantu menentukan pencarian dalam populasi yang berhasil. Ulangi sampai konvergensi. Tidak perlu gradien atau goni, hanya evaluasi SSE. Jika Anda tidak terlalu serakah ini sangat sering berhasil. Masalah yang sering orang miliki adalah bahwa mereka menggunakan pencarian lokal (Newton-Raphson) untuk melakukan pekerjaan pencarian global. Seperti biasa itu adalah masalah menggunakan alat yang tepat untuk pekerjaan yang dihadapi. Lebih masuk akal untuk menggunakan pencarian global EA untuk menemukan nilai awal untuk pencarian lokal Newton, dan kemudian biarkan ini berjalan ke minimum. Tetapi, seperti semua hal lainnya, iblis ada dalam detailnya.

Adrian O'Connor
sumber