R'de bir nls modeli için doğru başlangıç ​​değerlerini elde etme


13

Aşağıdaki gibi bir veri kümesine basit bir güç yasası modeli sığdırmaya çalışıyorum:

mydf:

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

Amaç, güç hattını geçmek ve revgelecek haftalara yönelik vlaueları tahmin etmek için kullanmaktır . Bir grup araştırma beni nlsşu şekilde uyguladığım işleve götürdü .

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

Bu bir lmmodel için çalışırken , singular gradientbaşlangıç ​​değerlerimle ilgili olduğunu anladığım bir hata alıyorum ave b. Excel'de bunu çizmek, yalnız kalmak, bir denklem almak, sonra denklemdeki değerleri kullanmak için bile devam eden farklı değerler denedim, ancak yine de hatayı alıyorum. Ben gibi cevaplar bir demet baktı bu bir ve ikinci cevap (birinci anlayamadık) çalıştı, ancak hiçbir sonuca.

Gerçekten doğru başlangıç ​​değerlerini bulma konusunda bazı yardımları kullanabilirim. Veya alternatif olarak, nls yerine başka hangi işlevi kullanabilirim.

mydfKolayca yeniden oluşturmak istiyorsanız :

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
R cinsinden belirtilmesine rağmen (gerçekten bir dilde belirtilmesi gerekir), doğrusal olmayan bir model uyumu için uygun başlangıç ​​değerlerinin nasıl bulunacağı, burada konu olmak için yeterince istatistikseldir, IMO. Gerçekten bir programlama Q değil, ör.
gung - Monica'yı eski haline getirin

Yanıtlar:


14

Bu, doğrusal olmayan en küçük kareler modellerinde yaygın bir sorundur; başlangıç ​​değerleriniz optimumdan çok uzaksa algoritma, optimumun yakınında iyi davranmış olsa bile yakınsama yapamayabilir.

log(a)b

ab

 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

Bu son derece yararlı, çok teşekkür ederim! Burada "a" değerinizi nasıl aldığınız hakkında bir sorum var. Lm (log10 (rev) ~ log10 (hafta)) çalıştırmayı ve sonra "özet" işlevini kullanarak denedim ve aynı "b" değerini alırken, benim "a" değeri 4.3201 çıkıyor. = 9.947'ye ulaşmak için farklı olarak ne yaptınız?
NeonBlueHair

exploge

Ah, tamamen haklısın. Benim üzerime amatör hata. Doğal log için "log" 10 ve "ln" anlamına gelen matematiksel gösterimi düşünmeye devam etti. Açıklama için teşekkürler.
NeonBlueHair

1
Birçok matematikçiye (ve birçok istatistikçiye), günah işlevine yönelik süssüz bir argüman radyanlarda olduğu gibi, süslenmemiş bir “kütük” doğal kütüktür. [Çatışma kuralları maalesef karışıklığa neden olabilir, ancak R kullanmaya başladığımda, örneğin, R ve ben aynı sözleşmeyi paylaştığından günlük işlevinin kullanımı hakkında iki kez düşünmedim.]
Glen_b -Restate Monica

4

Deneyin

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

Bu cevabı biraz genişletmem istendi. Bu sorun o kadar basit ki nls'in başarısız olduğu için şaşırdım. Ancak asıl sorun, R yaklaşımının tamamı ve doğrusal olmayan model uydurma felsefesi ile ilgilidir. Gerçek dünyada kişi x'i -1 ile 1 arasında olacak şekilde ölçeklendirir ve y ile y'yi 0 ile 1 arasında uzanır (y = ax ^ b). Bu muhtemelen nls yakınsama almak için yeterli olacaktır. Tabii ki Glen'in işaret ettiği gibi, karşılık gelen log-lineer modele sığabilirsiniz. Bu, modeli doğrusallaştıran basit bir dönüşümün varlığına dayanır. Genellikle durum böyle değildir. Nls gibi R rutinleriyle ilgili sorun, modeli yeniden parametrelendirmek için destek sunmamasıdır. Bu durumda yeniden parametrelendirme basittir, sadece x ve y değerlerini yeniden ölçeklendirin. Bununla birlikte, modele uyduğunda, kullanıcının orijinal parametrelerden farklı a ve b parametreleri olacaktır. Bunlardan orijinal olanları hesaplamak basit olsa da, diğer zorluk, genel olarak bu parametre tahminleri için tahmini standart sapmaları elde etmenin o kadar basit olmamasıdır. Bu, Hessian'ı log olabilirliği ve bazı türevleri içeren delta yöntemi ile yapılır. Doğrusal olmayan parametre tahmin yazılımı bu hesaplamaları otomatik olarak sağlamalıdır, böylece modelin yeniden parametrelendirmesi kolayca desteklenir. Yazılımın desteklemesi gereken bir diğer şey de aşama kavramıdır. Modeli Glen'in versiyonuna ilk olarak 1. aşama olarak takmayı düşünebilirsiniz. "Gerçek" model 2. aşamaya uygundur. diğer zorluk ise, bu parametre tahminleri için tahmini standart sapmaların elde edilmesinin genel olarak o kadar basit olmamasıdır. Bu, Hessian'ı log olabilirliği ve bazı türevleri içeren delta yöntemi ile yapılır. Doğrusal olmayan parametre tahmin yazılımı bu hesaplamaları otomatik olarak sağlamalıdır, böylece modelin yeniden parametrelendirmesi kolayca desteklenir. Yazılımın desteklemesi gereken bir diğer şey de aşama kavramıdır. Modeli Glen'in versiyonuna ilk olarak 1. aşama olarak takmayı düşünebilirsiniz. "Gerçek" model 2. aşamaya uygundur. diğer zorluk ise, bu parametre tahminleri için tahmini standart sapmaların elde edilmesinin genel olarak o kadar basit olmamasıdır. Bu, Hessian'ı log olabilirliği ve bazı türevleri içeren delta yöntemi ile yapılır. Doğrusal olmayan parametre tahmin yazılımı bu hesaplamaları otomatik olarak sağlamalıdır, böylece modelin yeniden parametrelendirmesi kolayca desteklenir. Yazılımın desteklemesi gereken bir diğer şey de aşama kavramıdır. Modeli Glen'in versiyonuna ilk olarak 1. aşama olarak takmayı düşünebilirsiniz. "Gerçek" model 2. aşamaya uygundur. Doğrusal olmayan parametre tahmin yazılımı bu hesaplamaları otomatik olarak sağlamalıdır, böylece modelin yeniden parametrelendirmesi kolayca desteklenir. Yazılımın desteklemesi gereken bir diğer şey de aşama kavramıdır. Modeli Glen'in versiyonuna ilk olarak 1. aşama olarak takmayı düşünebilirsiniz. "Gerçek" model 2. aşamaya uygundur. Doğrusal olmayan parametre tahmin yazılımı bu hesaplamaları otomatik olarak sağlamalıdır, böylece modelin yeniden parametrelendirmesi kolayca desteklenir. Yazılımın desteklemesi gereken bir diğer şey de aşama kavramıdır. Modeli Glen'in versiyonuna ilk olarak 1. aşama olarak takmayı düşünebilirsiniz. "Gerçek" model 2. aşamaya uygundur.

Modelinizi, aşamaları doğal bir şekilde destekleyen AD Model Builder ile uyduruyorum. İlk aşamada sadece a tahmin edildi. Bu, modelinizi basketbol sahasına getirir. İkinci aşamada a ve b'nin çözeltiyi aldığı tahmin edilmektedir. AD Model Builder, model parametrelerinin herhangi bir işlevi için standart sapmaları delta yöntemi ile otomatik olarak hesaplar, böylece modelin istikrarlı bir şekilde yeniden parametrelendirilmesini teşvik eder.


2

Levenberg-Marquardt algoritması aşağıdakilere yardımcı olabilir:

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

Deneyimlerime göre, NLR modellerinin parametreleri için başlangıç ​​değerleri bulmanın iyi bir yolu evrimsel bir algoritma kullanmaktır. Bir arama alanındaki rastgele tahminlerin (ebeveyn) ilk popülasyonundan (anne) en iyi 20'yi (yavru) seçin ve bunu, sonraki popülasyonda bir aramayı tanımlamaya yardımcı olması için kullanın. Yakınsama kadar tekrarlayın. Degradelere veya kendirlere gerek yok, sadece SSE değerlendirmeleri. Çok açgözlü değilseniz, bu genellikle işe yarar. İnsanların sıkça karşılaştıkları sorunlar, küresel bir araştırmanın çalışmasını gerçekleştirmek için yerel bir arama (Newton-Raphson) kullanıyor olmalarıdır. Her zaman olduğu gibi, eldeki iş için doğru aracı kullanmak meselesidir. Newton yerel aramasının başlangıç ​​değerlerini bulmak için bir EA global araması kullanmak daha mantıklıdır ve daha sonra bunun minimum seviyeye indirilmesine izin verin. Ancak, her şeyde olduğu gibi, şeytan ayrıntıda gizlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.