Saya memiliki beberapa data dasar tentang pengurangan emisi dan biaya per mobil:
q24 <- read.table(text = "reductions cost.per.car
50 45
55 55
60 62
65 70
70 80
75 90
80 100
85 200
90 375
95 600
",header = TRUE, sep = "")
Saya tahu bahwa ini adalah fungsi eksponensial, jadi saya berharap dapat menemukan model yang cocok dengan:
model <- nls(cost.per.car ~ a * exp(b * reductions) + c,
data = q24,
start = list(a=1, b=1, c=0))
tapi saya mendapatkan kesalahan:
Error in nlsModel(formula, mf, start, wts) :
singular gradient matrix at initial parameter estimates
Saya telah membaca banyak pertanyaan tentang kesalahan yang saya lihat dan saya temui bahwa masalahnya mungkin karena saya membutuhkan nilai yang lebih baik / berbeda start
( initial parameter estimates
masuk akal sedikit) tetapi saya tidak yakin, mengingat data yang saya miliki, bagaimana saya akan memperkirakan parameter yang lebih baik.
r
self-study
exponential
starting-values
Amanda
sumber
sumber
exp(50)
danexp(95)
dengan nilai-y pada x = 50 dan x = 95. Jika Anda menetapkanc=0
dan mengambil log y (membuat hubungan linier), Anda dapat menggunakan regresi untuk mendapatkan taksiran awal untuk log ( ) dan yang akan mencukupi untuk data Anda (atau jika Anda mencocokkan sebuah baris dengan sumbernya, Anda dapat meninggalkan at 1 dan cukup gunakan estimasi untuk ; itu juga cukup untuk data Anda). Jika jauh di luar interval yang cukup sempit di sekitar kedua nilai tersebut, Anda akan mengalami beberapa masalah. [Atau coba algoritma lain]b a b bJawaban:
Secara otomatis menemukan nilai awal yang baik untuk model nonlinear adalah seni. (Ini relatif mudah untuk dataset satu kali ketika Anda hanya bisa memplot data dan membuat beberapa tebakan yang bagus secara visual.) Salah satu pendekatan adalah membuat linierisasi model dan menggunakan estimasi kuadrat terkecil.
Dalam hal ini, model memiliki bentuk
untuk parameter yang tidak diketahui . Kehadiran eksponensial mendorong kita untuk menggunakan logaritma - tetapi penambahan membuatnya sulit untuk melakukan itu. Perhatikan, meskipun, bahwa jika positif maka akan kurang dari nilai yang diharapkan terkecil dari --dan karena itu mungkin sedikit kurang dari yang terkecil diamati nilai . (Jika bisa negatif Anda juga harus mempertimbangkan nilai yang sedikit lebih besar dari nilai diamati terbesar .)c a c Y Y a c Ya , b , c c a c Y Y a c Y
Mari kita jaga dengan menggunakan estimasi awal kira-kira setengah dari minimum pengamatan . Model sekarang dapat ditulis ulang tanpa istilah aditif berduri sebagaic 0 y ic c0 yi
Bahwa kita dapat mengambil log dari:
Itu adalah pendekatan linier ke model. Baik danlog(a) b
Berikut adalah kode yang direvisi:
Outputnya (untuk data contoh) adalah
Konvergensi terlihat bagus. Mari kita plot itu:
Itu bekerja dengan baik!
Metode lain untuk memperkirakan nilai awal bergantung pada pemahaman apa artinya, yang dapat didasarkan pada pengalaman, teori fisik, dll. Contoh tambahan dari kesesuaian nonlinier (cukup sulit) yang nilai awalnya dapat ditentukan dengan cara ini dijelaskan dalam jawaban saya di /stats//a/15769 .
Analisis visual sebar (untuk menentukan perkiraan parameter awal) dijelaskan dan diilustrasikan di /stats//a/32832 .
Dalam beberapa keadaan, urutan cocok nonlinear dibuat di mana Anda dapat mengharapkan solusi berubah perlahan. Dalam hal ini, sering kali nyaman (dan cepat) untuk menggunakan solusi sebelumnya sebagai perkiraan awal untuk yang berikutnya . Saya ingat menggunakan teknik ini (tanpa komentar) di /stats//a/63169 .
sumber
Pustaka ini dapat menyelesaikan masalah saya dengan nls
singular gradient
: http://www.r-bloggers.com/a-better-nls/ Contoh:sumber
nls.lm
sekarang.Jadi ... Saya rasa saya salah membaca ini sebagai fungsi eksponensial. Yang saya butuhkan adalah
poly()
Atau, menggunakan
lattice
:sumber