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.a
Bagaimana ini bisa dilakukan?
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.a
Bagaimana ini bisa dilakukan?
Jawaban:
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.
(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, nls
dapat melakukan batasan kotak; seperti yang ditunjukkan pada contoh, itu sangat mudah dilakukan.
Anda dapat menggunakan regresi terbatas lebih langsung; Saya pikir pcls
fungsi dari paket "mgcv" dan nnls
fungsi dari paket "nnls" keduanya.
-
Edit untuk menjawab pertanyaan tindak lanjut -
Saya akan menunjukkan kepada Anda bagaimana menggunakannya dengan nlminb
yang datang dengan R, tapi saya menyadari bahwa nls
sudah 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.
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 summary
itu bahkan akan menghasilkan kesalahan standar dan nilai-t tetapi saya tidak yakin betapa berartinya ini.
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:
nls
untuk melakukannya.
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)
Hasil ini masih akan memberikan interval kredibel dari parameter bunga (tentu saja kebermaknaan interval ini akan didasarkan pada kewajaran informasi Anda sebelumnya tentang lereng).
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