Kesalahan gradien tunggal dalam nls dengan nilai awal yang benar

19

Saya mencoba menyesuaikan garis + kurva eksponensial untuk beberapa data. Sebagai permulaan, saya mencoba melakukan ini pada beberapa data buatan. Fungsinya adalah: Ini secara efektif merupakan kurva eksponensial dengan bagian linier, serta parameter pergeseran horizontal tambahan ( m ). Namun, ketika saya menggunakan fungsi R saya mendapatkan kesalahan " singular gradient matrix pada estimasi parameter awal ", bahkan jika saya menggunakan parameter yang sama yang saya gunakan untuk menghasilkan data di tempat pertama. Saya sudah mencoba algoritma yang berbeda, nilai awal yang berbeda dan mencoba menggunakan

y=a+br(xm)+cx
nls()
optimuntuk meminimalkan jumlah sisa kuadrat, semuanya sia-sia. Saya sudah membaca bahwa alasan yang mungkin untuk hal ini bisa menjadi parametris berlebihan formula, tetapi saya tidak berpikir itu (kan?)
Apakah ada yang punya saran untuk masalah ini? Atau ini hanya model yang canggung?

Contoh singkat:

#parameters used to generate the data
reala=-3
realb=5
realc=0.5
realr=0.7
realm=1
x=1:11 #x values - I have 11 timepoint data
#linear+exponential function
y=reala + realb*realr^(x-realm) + realc*x
#add a bit of noise to avoid zero-residual data
jitter_y = jitter(y,amount=0.2)
testdat=data.frame(x,jitter_y)

#try the regression with similar starting values to the the real parameters
linexp=nls(jitter_y~a+b*r^(x-m)+c*x, data=testdat, start=list(a=-3, b=5, c=0.5, r=0.7, m=1), trace=T)

Terima kasih!

Steiny
sumber
2
rxrbrm=constant(b,m)b=rmconstant
1
brr(0,1)

Jawaban:

16

Saya digigit oleh ini baru-baru ini. Niat saya sama, membuat beberapa model buatan dan mengujinya. Alasan utamanya adalah alasan yang diberikan oleh @whuber dan @marco. Model seperti itu tidak diidentifikasi. Untuk melihat itu, ingatlah bahwa NLS meminimalkan fungsi:

i=1n(yiabrximcxi)2

(a,b,m,r,c)(a,brm,0,r,c)

Juga tidak sulit untuk melihat mengapa gradiennya tunggal. Menunjukkan

f(a,b,r,m,c,x)=a+brxm+cx

Kemudian

fb=rxm

fm=blnrrxm

x

blnrfb+fm=0.

Karena itu matriks

(f(x1)f(xn))

tidak akan memiliki peringkat penuh dan inilah mengapa nlsakan memberikan pesan gradien singular.

Saya telah menghabiskan lebih dari seminggu mencari bug di kode saya di tempat lain sampai saya perhatikan bahwa bug utama ada dalam model :)

mpiktas
sumber
2
Ini sudah tua, saya tahu tetapi hanya ingin tahu, apakah ini berarti nls tidak dapat digunakan pada model yang tidak dapat diidentifikasi? Misalnya, jaringan saraf?
Hitung Nol
peluang besar, saya tahu, tetapi bisakah Anda memecah ini untuk orang-orang yang kurang mengingat? :) juga, apa solusi untuk masalah OP, kalau begitu? Menyerah dan pulang?
theforestecologist
2
brxmβrxmββ=brm
@CountZero, pada dasarnya ya, metode optimisasi biasa akan gagal jika parameternya tidak teridentifikasi. Jaringan saraf menghindari masalah ini, dengan menambahkan kendala tambahan dan menggunakan trik menarik lainnya.
mpiktas
fm=blnr rxm
17

Jawaban di atas tentu saja benar. Untuk apa nilainya, di samping penjelasan yang diberikan, jika Anda mencoba ini pada set data buatan, menurut halaman bantuan nls ditemukan di: http://stat.ethz.ch/R-manual/R-patched/ perpustakaan / statistik / html / nls.html

R's nls tidak akan bisa menanganinya. Halaman bantuan secara khusus menyatakan:

Peringatan

Jangan gunakan nls pada data "zero-residual" buatan.

Fungsi nls menggunakan kriteria konvergensi relatif-offset yang membandingkan ketidaktepatan numerik pada estimasi parameter saat ini dengan jumlah sisa kuadrat-kuadrat. Ini berkinerja baik pada data formulir

y = f (x, θ) + eps

(dengan var (eps)> 0). Gagal menunjukkan konvergensi pada data formulir

y = f (x, θ)

karena kriteria sama dengan membandingkan dua komponen kesalahan pembulatan. Jika Anda ingin menguji nls pada data buatan, harap tambahkan komponen derau, seperti yang ditunjukkan pada contoh di bawah ini.

Jadi, tidak ada suara == tidak baik untuk R's nls.

B_D_Dubbya
sumber
Selamat datang di situs ini, @B_D_Dubbya. Saya mengambil kebebasan memformat jawaban Anda, saya harap Anda tidak keberatan. Anda dapat menemukan info lebih lanjut tentang mengedit jawaban Anda di CV di sini .
gung - Reinstate Monica
1
Saya menyadari masalah ini - karenanya menggunakan fungsi "jitter" untuk menambahkan beberapa kebisingan
steiny