Eğim kısıtı ile doğrusal regresyon


18

İçinde çok basit bir doğrusal regresyon yapmak istiyorum R. Formül kadar basittir . Ancak ( ) eğiminin bir aralık içinde olmasını isterim, diyelim ki 1.4 ile 1.6 arasında.y=ax+ba

Bu nasıl yapılabilir?

Yanıtlar:


24

R'de ... doğrusal regresyon yapmak istiyorum. Eğimin bir aralık içinde olmasını istiyorum, diyelim ki 1.4 ile 1.6 arasında. Bu nasıl yapılabilir?

(i) Basit yol:

  • regresyona uygun. Eğer sınırlar içindeyse, işiniz bitti.

  • Sınırlarda değilse, eğimi en yakın sınıra ayarlayın ve

  • tüm gözlemler üzerinden ortalama olarak tahmin eder .(yax)

(ii) Daha karmaşık bir yol: eğimde kutu kısıtlamaları olan en az kareler yapın; birçok optimizasyon rutini kutu kısıtlamaları uygular, örneğin nlminb(R ile birlikte gelir) yapar.

Düzenleme: aslında (aşağıdaki örnekte belirtildiği gibi), vanilya R, nlskutu kısıtlamaları yapabilir; örnekte gösterildiği gibi, bu gerçekten çok kolay.

Kısıtlı regresyonu daha doğrudan kullanabilirsiniz; Ben pclspaket "mgcv" nnlsişlevini ve paket "nnls" işlevini her ikisi de düşünüyorum.

-

Takip sorusunu yanıtlamak için düzenleyin -

Bunu nlminbR ile birlikte geldiğinden beri nasıl kullanacağınızı gösterecektim , ancak nlskısıtlanmış en küçük kareleri uygulamak için zaten aynı rutinleri (PORT rutinleri) kullandığını fark ettim , bu yüzden aşağıdaki örneğim bu durumda.

Not: aşağıdaki örneğimde, kesişme noktasıdır ve b eğimdir (istatistiklerde daha yaygın olan konvansiyon). Buraya koyduktan sonra bunun tersine başladığını fark ettim; Yine de, sorunuza göre 'geriye' örnek bırakacağım.birb

İlk olarak, aralık içindeki 'gerçek' eğim ile bazı veriler ayarlayın:

 set.seed(seed=439812L)
 x=runif(35,10,30)
 y = 5.8 + 1.53*x + rnorm(35,s=5)  # population slope is in range
 plot(x,y)
 lm(y~x)

Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)            x  
     12.681        1.217  

... ancak LS tahmini bunun dışında, sadece rastgele varyasyondan kaynaklanıyor. Kısıtlı regresyonu şu şekilde kullanalım nls:

 nls(y~a+b*x,algorithm="port",
   start=c(a=0,b=1.5),lower=c(a=-Inf,b=1.4),upper=c(a=Inf,b=1.6))

Nonlinear regression model
  model: y ~ a + b * x
   data: parent.frame()
    a     b 
9.019 1.400 
 residual sum-of-squares: 706.2

Algorithm "port", convergence message: both X-convergence and relative convergence (5)

Gördüğünüz gibi, sınırın üzerinde bir eğim elde edersiniz. Eğer takılan modeli geçerseniz, summarystandart hatalar ve t-değerleri bile üretecektir, ancak bunların ne kadar anlamlı / yorumlanabilir olduğundan emin değilim.

Peki önerim (1) nasıl karşılaştırıyor? (yani eğimi en yakın sınıra ayarlayın ve kesmeyi tahmin etmek için artıklarının ortalamasını alın )ybx

 b=1.4
 c(a=mean(y-x*b),b=b)
       a        b 
9.019376 1.400000

Aynı tahmin ...

Aşağıdaki grafikte, mavi çizgi en küçük kareler ve kırmızı çizgi de kısıtlanan en küçük karelerdir:

kısıtlı ve LS hattı


Bu cevap için teşekkür ederim ama ... bu işlevlerden herhangi birini kullanarak bir örnek verebilir misiniz?
Iñigo Hernáez Corres

1
+1 Parametre tahminlerinde güven aralıkları bulmak her durumda zor olacaktır.
whuber

@ IñigoHernáezCorres cevabımın güncellemesini görüyorum nls.
Glen_b-Monica

Bunu yapmanın iki yolu üzerinde bağlantılarla +1 harika cevap!
Haitao Du

15

Glen_b'in kutu kısıtlı en küçük kareleri kullanan ikinci yöntemi, sırt regresyonu ile daha kolay uygulanabilir. Sırt regresyonunun çözümü, ağırlık vektörünün normunun (ve dolayısıyla eğiminin) büyüklüğüne bağlı bir regresyon için Lagrange olarak görülebilir. Bu nedenle, aşağıdaki whuber önerisini takiben, yaklaşım (1.6 + 1.4) / 2 = 1.5 eğilimini çıkarmak ve daha sonra sırt regresyonunu uygulamak ve eğim büyüklüğü 0.1'den küçük veya ona eşit olana kadar sırt parametresini kademeli olarak artırmak olacaktır.

Bu yaklaşımın yararı, fantezi optimizasyon araçlarına ihtiyaç duyulmamasıdır, sadece R'de (ve diğer birçok pakette) bulunan sırt regresonudur.

Ancak Glen_b'in basit çözümü (i) bana mantıklı geliyor (+1)


5
Bu zekice, ama tarif edildiği gibi çalışacağından emin misiniz? Bana göre uygun yaklaşım (1.6 + 1.4) / 2 = 1.5 eğilimini kaldırmak ve daha sonra eğimin mutlak değeri 0.1'e eşit veya daha düşük olana kadar sırt parametresini kontrol etmek olacaktır.
whuber

1
evet, bu gerçekten daha iyi bir öneri. Sırt regresyon yaklaşımı, kısıtlama eğimin büyüklüğü üzerindeyse gerçekten daha uygundur, oldukça garip bir sorun gibi geliyor! Cevabım aslında Glen_b'in kutu kısıtlamaları hakkındaki yorumundan ilham aldı, sırt regresyonu temelde kutu kısıtlamalarını uygulamanın daha kolay bir yoludur.
Dikran Marsupial

Yorumlarımı kabul ettiğinizi takdir etsem de, cevabınızın içeriğinden uzaklaşıyor. Yapabildiğimiz her yerde çalışmalarımızı geliştirmek için hep birlikte birlikteyiz, bu yüzden önerilerime göre hareket etmeniz yeterli bir teşekkür. Bunun için itibardaki artışı hak ediyorsunuz . Ek düzenlemeler yapmak üzere taşındıysanız, lütfen gereksiz materyali kaldırarak metni düzene sokmayı düşünün.
whuber

Düzenli gereksiz materyaller, ancak işbirliklerinden hoşlanıyorum ve her zaman işbirlikçilere hak ettikleri krediyi vermeye çalışıyorum ve hala ahlaki olarak oyların yarısını hak ettiğinizi düşünüyorum. ; o)
Dikran Marsupial

10

a

bir

Bu sonuç yine de ilgili parametrelerin güvenilir aralıklarını verecektir (elbette bu aralıkların anlamlılığı, eğim hakkındaki önceki bilgilerinizin makul olup olmadığına bağlı olacaktır).


+1, bu benim de ilk düşüncemdi. Diğer önerileri seviyorum, ama bu benim için en iyisi gibi görünüyor.
gung - Monica'yı eski durumuna döndürün

0

Başka bir yaklaşım da bir optimizasyon problemi olarak regresyonunuzu yeniden formüle etmek ve bir optimizer kullanmak olabilir. Bu şekilde yeniden formüle edilip edilemeyeceğinden emin değilim, ancak R optimize edicilerdeki bu blog gönderisini okuduğumda bu soruyu düşündüm:

http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html

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.