İç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.
Bu nasıl yapılabilir?
İç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.
Bu nasıl yapılabilir?
Yanıtlar:
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 .
(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, nls
kutu kısıtlamaları yapabilir; örnekte gösterildiği gibi, bu gerçekten çok kolay.
Kısıtlı regresyonu daha doğrudan kullanabilirsiniz; Ben pcls
paket "mgcv" nnls
işlevini ve paket "nnls" işlevini her ikisi de düşünüyorum.
-
Takip sorusunu yanıtlamak için düzenleyin -
Bunu nlminb
R ile birlikte geldiğinden beri nasıl kullanacağınızı gösterecektim , ancak nls
kı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.
İ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, summary
standart 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 )
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:
nls
.
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)
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).
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