Regresi linier dengan kendala kemiringan

18

Saya ingin melakukan regresi linier yang sangat sederhana di R. Rumusnya sesederhana . Namun saya ingin kemiringan ( ) berada di dalam interval, katakanlah, antara 1,4 dan 1,6.ay=Sebuahx+bSebuah

Bagaimana ini bisa dilakukan?

Iñigo Hernáez Corres
sumber

Jawaban:

24

Saya ingin melakukan ... regresi linear dalam R. ... Saya ingin kemiringan berada di dalam interval, katakanlah, antara 1,4 dan 1,6. Bagaimana ini bisa dilakukan?

(i) Cara sederhana:

  • sesuai dengan regresi. Jika sudah dalam batas, Anda sudah selesai.

  • Jika tidak ada dalam batas, atur kemiringan ke batas terdekat, dan

  • perkirakan intersep sebagai rata-rata atas semua pengamatan.(yax)

(ii) Cara yang lebih rumit: lakukan kuadrat terkecil dengan batasan kotak pada lereng; banyak rutin optimizaton menerapkan batasan kotak, misalnya nlminb(yang datang dengan R) tidak.

Sunting: sebenarnya (seperti yang disebutkan dalam contoh di bawah), di vanilla R, nlsdapat melakukan batasan kotak; seperti yang ditunjukkan pada contoh, itu sangat mudah dilakukan.

Anda dapat menggunakan regresi terbatas lebih langsung; Saya pikir pclsfungsi dari paket "mgcv" dan nnlsfungsi dari paket "nnls" keduanya.

-

Edit untuk menjawab pertanyaan tindak lanjut -

Saya akan menunjukkan kepada Anda bagaimana menggunakannya dengan nlminbyang datang dengan R, tapi saya menyadari bahwa nlssudah menggunakan rutin yang sama (rutin PORT) untuk mengimplementasikan kuadrat terkecil yang dibatasi, jadi contoh saya di bawah ini menunjukkan kasusnya.

NB: dalam contoh saya di bawah ini, adalah intersep dan b adalah kemiringan (konvensi yang lebih umum dalam statistik). Saya menyadari setelah saya taruh di sini bahwa Anda memulai sebaliknya; Saya akan memberikan contoh 'terbelakang' relatif terhadap pertanyaan Anda.Sebuahb

Pertama, siapkan beberapa data dengan kemiringan 'benar' di dalam rentang:

 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  

... tetapi perkiraan LS jauh di luarnya, hanya disebabkan oleh variasi acak. Jadi mari kita gunakan regresi terbatas di 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)

Seperti yang Anda lihat, Anda mendapatkan kemiringan tepat pada batas. Jika Anda melewatkan model yang cocok untuk summaryitu bahkan akan menghasilkan kesalahan standar dan nilai-t tetapi saya tidak yakin betapa berartinya ini.

y-bx

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

Itu perkiraan yang sama ...

Dalam plot di bawah ini, garis biru adalah kuadrat terkecil dan garis merah adalah kuadrat terkecil yang dibatasi:

dibatasi dan garis LS

Glen_b -Reinstate Monica
sumber
Terima kasih atas jawaban ini, tetapi ... bisakah Anda memberi contoh menggunakan fungsi-fungsi ini?
Iñigo Hernáez Corres
1
+1 Menemukan interval kepercayaan pada estimasi parameter akan menjadi tantangan dalam peristiwa apa pun.
whuber
@ IñigoHernáezCorres melihat pembaruan untuk jawaban saya, di mana saya ilustrasikan menggunakan nlsuntuk melakukannya.
Glen_b -Reinstate Monica
+1 jawaban bagus dengan koneksi pada dua cara melakukannya!
Haitao Du
15

Metode kedua Glen_b, menggunakan kuadrat terkecil dengan batasan kotak dapat lebih mudah diimplementasikan melalui regresi ridge. Solusi untuk regresi ridge dapat dilihat sebagai Lagrangian untuk regresi dengan terikat pada besarnya norma vektor bobot (dan karenanya kemiringannya). Jadi mengikuti saran whuber di bawah ini, pendekatannya adalah dengan mengurangi tren (1,6 + 1,4) / 2 = 1,5 dan kemudian menerapkan regresi punggungan dan secara bertahap meningkatkan parameter punggungan sampai besarnya kemiringan kurang dari atau sama dengan 0,1.

Manfaat dari pendekatan ini adalah bahwa tidak ada alat optimasi yang diperlukan, hanya ridge regresson, yang sudah tersedia di R (dan banyak paket lainnya).

Namun solusi sederhana Glen_b (i) tampaknya masuk akal bagi saya (+1)

Dikran Marsupial
sumber
5
Ini pintar, tetapi apakah Anda yakin itu akan berfungsi seperti yang dijelaskan? Menurut saya pendekatan yang tepat adalah menghapus tren (1.6 + 1.4) / 2 = 1.5 dan kemudian mengontrol parameter ridge sampai nilai absolut dari slope kurang dari atau sama dengan 0,1.
whuber
1
ya, itu memang saran yang lebih baik. Pendekatan regresi ridge benar-benar lebih tepat jika batasannya pada besarnya kemiringan, sepertinya masalah yang cukup aneh! Jawaban saya awalnya terinspirasi oleh komentar Glen_b pada batasan kotak, regresi ridge pada dasarnya hanya cara yang lebih mudah untuk mengimplementasikan batasan kotak.
Dikran Marsupial
Meskipun saya menghargai pengakuan Anda atas komentar saya, itu mengalihkan perhatian dari isi jawaban Anda. Kita semua bersama-sama meningkatkan pekerjaan kita di mana pun kita bisa, jadi cukup pengakuan bahwa Anda menindaklanjuti saran saya. Untuk itu Anda pantas mendapatkan peningkatan reputasi. Jika Anda tergerak untuk melakukan pengeditan tambahan, harap pertimbangkan untuk merampingkan teks dengan menghapus materi yang berlebihan itu.
whuber
Materi yang berlebihan diedit, namun saya menikmati kolaborasi dan selalu berusaha memberi kolaborator penghargaan yang layak mereka terima, dan masih berpikir secara moral Anda pantas mendapatkan setengah suara. ; o)
Dikran Marsupial
10

Sebuah

Sebuah

Hasil ini masih akan memberikan interval kredibel dari parameter bunga (tentu saja kebermaknaan interval ini akan didasarkan pada kewajaran informasi Anda sebelumnya tentang lereng).

Greg Snow
sumber
+1, ini adalah pikiran pertama saya juga. Saya suka saran lain, tapi ini sepertinya yang terbaik untuk saya.
gung - Reinstate Monica
0

Pendekatan lain mungkin untuk merumuskan kembali regresi Anda sebagai masalah optimasi dan menggunakan pengoptimal. Saya tidak yakin apakah itu dapat diformulasikan ulang dengan cara ini, tetapi saya memikirkan pertanyaan ini ketika saya membaca posting blog ini di pengoptimal R:

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

Wayne
sumber