Lakukan regresi linier, tetapi paksa solusi untuk melewati beberapa titik data tertentu

14

Saya tahu bagaimana melakukan regresi linier pada set poin. Yaitu, saya tahu bagaimana menyesuaikan polinomial pilihan saya, dengan kumpulan data yang diberikan, (dalam arti LSE). Namun, yang saya tidak tahu, adalah bagaimana memaksa solusi saya untuk melewati beberapa poin tertentu yang saya pilih. Saya telah melihat ini dilakukan sebelumnya, tetapi saya tidak ingat apa prosedurnya, apalagi bagaimana itu dilakukan.

Sebagai contoh yang sangat sederhana dan konkret, mari kita katakan bahwa saya memiliki 100 poin yang tersebar di bidang xy, dan saya memilih untuk memasukkan polinomial pesanan apa pun melalui mereka. Saya tahu bagaimana melakukan regresi linier ini dengan sangat baik. Namun, mari kita katakan bahwa saya ingin 'memaksa' solusi saya, untuk melewati, katakanlah, tiga titik data saya di koordinat , , dan , (dan koordinat y-nya yang sesuai tentu saja).x = 19 x = 89x=3x=19x=89

Apa yang disebut prosedur umum ini, bagaimana hal itu dilakukan, dan adakah perangkap khusus yang perlu saya ketahui?

Edit:

Saya ingin menambahkan, bahwa saya sedang mencari cara konkret untuk melakukan ini. Saya telah menulis sebuah program yang benar-benar melakukan regresi linier dalam satu dari dua cara, membalikkan matriks kovarians secara langsung, atau melalui gradient descent. Yang saya tanyakan adalah, bagaimana, tepatnya, langkah demi langkah, bagaimana saya memodifikasi apa yang saya lakukan, sehingga saya memaksa solusi polinomial untuk melalui poin-poin tertentu?

Terima kasih!

Spacey
sumber
Mengapa Anda menyebutnya "linear" jika Anda menggunakan polinomial? Setiap poin yang Anda ingin sampaikan adalah kendala yang akan mengurangi tingkat kebebasan Anda. Anda kemudian dapat menggunakan algoritma optimasi terbatas.
curious_cat
4
Itu linier karena Anda menemukan koefisien untuk kombinasi linier . Misalnya, jika Anda ingin mencocokkan data Anda dengan kubik, maka Anda menemukan ( ) dari . y = c 0 + c 1 x + c 2 x 2 + c 3 x 3cy=c0+c1x+c2x2+c3x3
Spacey
1
@Mohammad: Salah satu cara lain untuk memperkirakan apa yang Anda inginkan adalah dengan menggunakan solusi kuadrat terkecil, dan memberikan bobot yang sangat besar ke titik-titik yang ingin dilewati garis regresi. Ini harus memaksa solusi melewati sangat dekat ke poin yang Anda pilih.
Jason R
@JasonR Senang bertemu Anda di sini. Ya WLS memang merupakan pesaing yang menarik. Saya telah menjawab dengan jawaban karena faktorisasi polinomial yang pintar, dan karena itu mempertahankan struktur kesalahan dengan baik.
Spacey

Jawaban:

19

Model yang dimaksud dapat ditulis

y=p(x)+(xx1)(xxd)(β0+β1x++βpxp)+ε

di mana adalah polinomial derajat melewati titik yang telah ditentukan dan adalah acak. (Gunakan polinomial interpolasi Lagrange .) Menulis memungkinkan kita untuk menulis ulang model ini sebagai d - 1 ( x 1 , y 1 ) , , ( x d , y d ) ε ( x - x 1 ) ( x - x d ) = r ( x )p(xi)=yid1(x1,y1),,(xd,yd)ε(xx1)(xxd)=r(x)

yp(x)=β0r(x)+β1r(x)x+β2r(x)x2++βpr(x)xp+ε,

yang merupakan masalah regresi berganda OLS standar dengan struktur kesalahan yang sama dengan yang asli di mana variabel independen adalah kuantitas . Hitung saja variabel-variabel ini dan jalankan perangkat lunak regresi yang Anda kenal , pastikan untuk mencegahnya memasukkan istilah yang konstan. Peringatan biasa tentang regresi tanpa istilah yang konstan berlaku; khususnya, dapat secara artifisial tinggi; interpretasi yang biasa tidak berlaku.r ( x ) x i , i = 0 , 1 , , p R 2p+1r(x)xi, i=0,1,,pR2

(Bahkan, regresi melalui titik asal adalah kasus khusus dari konstruksi ini di mana , ( x 1 , y 1 ) = ( 0 , 0 ) , dan p ( x ) = 0 , sehingga modelnya adalah y = β 0 x + + β p x p + 1 + ε . )d=1(x1,y1)=(0,0)p(x)=0y=β0x++βpxp+1+ε.


Berikut ini contoh yang berhasil (dalam R)

# Generate some data that *do* pass through three points (up to random error).
x <- 1:24
f <- function(x) ( (x-2)*(x-12) + (x-2)*(x-23) + (x-12)*(x-23) )  / 100
y0 <-(x-2) * (x-12) * (x-23) * (1 + x - (x/24)^2) / 10^4  + f(x)
set.seed(17)
eps <- rnorm(length(y0), mean=0, 1/2)
y <- y0 + eps
data <- data.frame(x,y)

# Plot the data and the three special points.
plot(data)
points(cbind(c(2,12,23), f(c(2,12,23))), pch=19, col="Red", cex=1.5)

# For comparison, conduct unconstrained polynomial regression
data$x2 <- x^2
data$x3 <- x^3
data$x4 <- x^4

fit0 <- lm(y ~ x + x2 + x3 + x4, data=data)
lines(predict(fit0), lty=2, lwd=2)

# Conduct the constrained regressions
data$y1 <- y - f(x)
data$r <- (x-2)*(x-12)*(x-23)
data$z0 <- data$r
data$z1 <- data$r * x
data$z2 <- data$r * x^2

fit <- lm(y1 ~ z0 + z1 + z2 - 1, data=data)
lines(predict(fit) + f(x), col="Red", lwd=2)

Merencanakan

Tiga titik tetap ditampilkan dalam warna merah solid - mereka bukan bagian dari data. Kotak kuadrat polinomial urutan keempat yang tidak dibatasi ditampilkan dengan garis putus-putus hitam (memiliki lima parameter); fit terbatas (dari pesanan lima, tetapi dengan hanya tiga parameter gratis) ditunjukkan dengan garis merah.

Memeriksa keluaran kuadrat terkecil ( summary(fit0)dan summary(fit)) bisa menjadi pelajaran - saya serahkan ini pada pembaca yang tertarik.

whuber
sumber
βr(x)xixir(x)
Saya telah menambahkan contoh yang berhasil, Mohammad.
whuber
Oh, sempurna. Saya akan mempelajarinya. Menggunakan contoh Anda, masih mungkin untuk memaksa poli melewati titik-titik yang merupakan bagian dari data, kan?
Spacey
Tentu saja itu dapat dilakukan: tetapi berhati-hatilah dalam menafsirkan nilai-p atau statistik lainnya, karena sekarang kendala Anda didasarkan pada data itu sendiri.
Whuber
Pos Anda membuat saya terjaga tadi malam. Saya belajar sendiri LIP. (LIP menarik. Ini seperti dekomposisi Fourier tetapi dengan polys).
Spacey
9

(xi,yi)xixyiy

Jika Anda ingin memaksakan garis melewati dua titik dalam bidang XY, itu cukup mudah dilakukan. Dua poin bisa cocok dengan garis. Anda bisa menggunakan rumus titik-kemiringan untuk menghitung kemiringan Anda, dan kemudian menggunakan salah satu poin, kemiringan, dan persamaan garis untuk menemukan intersep.

XX2


Namun saya merasa harus menyebutkan pada titik ini bahwa ini mungkin bukan hal yang baik untuk dilakukan (kecuali teori Anda memberikan alasan yang sangat kuat untuk melakukannya). Anda mungkin juga ingin melihat ke dalam regresi Bayesian , di mana Anda dapat memungkinkan model Anda untuk menemukan kombinasi terbaik dari informasi dalam data Anda, dan beberapa informasi sebelumnya (yang dapat Anda gunakan untuk sangat bias mencegat intersep Anda ke nol, misalnya, tanpa cukup memaksanya).

gung - Pasang kembali Monica
sumber
1
xiyi
2
Meskipun melemparkan tiga poin lebih banyak dan menimbangnya ( jawaban ala Glen_b) dapat menciptakan kecocokan seperti itu, menafsirkan salah satu dari output statistik akan bermasalah: beberapa penyesuaian akan diperlukan.
whuber
6

Untuk menambahkan sedikit informasi tambahan ke liputan @ gung yang sangat baik tentang kasus linear, dalam kasus polinomial tingkat tinggi ada beberapa cara Anda bisa melakukannya dengan tepat atau kira-kira (tetapi cukup seakurat yang Anda butuhkan).

Pertama, perhatikan bahwa derajat kebebasan untuk polinomial (atau bahkan dari fungsi apa pun yang cocok) harus setidaknya sebesar jumlah titik "yang diketahui". Jika derajat kebebasannya sama, Anda tidak perlu data sama sekali, karena kurva sepenuhnya ditentukan. Jika ada lebih banyak poin 'diketahui' Anda tidak bisa menyelesaikannya (kecuali mereka semua terletak pada polinomial yang sama persis dari tingkat yang ditentukan dalam hal mana cukup subset berukuran sesuai akan cukup). Dari sini, saya hanya akan berbicara tentang kapan polinomial memiliki lebih banyak df daripada poin yang diketahui (seperti kubik - dengan 4df - dan tiga poin yang diketahui, sehingga kubik tidak terlalu ditentukan oleh poin yang diketahui atau tidak sepenuhnya ditentukan oleh mereka) .

1) "kurva harus melewati titik ini" adalah batasan linier pada parameter, menghasilkan estimasi terbatas atau kuadrat terkecil terbatasi (meskipun kedua istilah dapat mencakup hal-hal lain selain batasan linear, seperti batasan positif). Anda dapat memasukkan batasan linear dengan salah satunya

  (a) menyusun kembali parameterisasi untuk secara implisit memasukkan setiap kendala yang menghasilkan model urutan yang lebih rendah.

  (B) menggunakan alat standar yang dapat menggabungkan kendala linier pada parameter yang paling cocok kuadrat. (biasanya melalui sesuatu seperti rumus yang diberikan di tautan di atas)

2) Cara lain adalah melalui regresi tertimbang. Jika Anda memberikan poin yang diketahui cukup besar, pada dasarnya Anda bisa mendapatkan kecocokan yang sama seperti pada (1). Ini sering kali mudah diimplementasikan, bisa jauh lebih cepat daripada reparameterisasi, dan dapat dilakukan dalam paket yang tidak menawarkan pemasangan terbatas.

Semua peringatan @ gung berlaku

Glen_b -Reinstate Monica
sumber
Glen_b, saya belum mempertimbangkan regresi tertimbang. Mungkin cara untuk melakukannya. Saya telah memasukkannya ke dalam daftar tugas saya. Saya percaya saya bisa belajar sendiri tanpa insiden. Mengenai (1), dapatkah Anda memperluas aspek paramaterisasi kembali? Juga, apa yang Anda 'sebut' ini yang saya coba lakukan, di mana saya memaksa polinomial untuk melalui poin-poin tertentu? Bagian dari masalahnya adalah saya tidak tahu untuk apa google. Jika saya tahu apa namanya, saya mungkin dapat menambah apa yang Anda katakan dengan materi online. Terima kasih.
Spacey
Lihat hasil edit saya di atas, yang mencakup beberapa istilah pencarian dan tautan dengan beberapa detail lagi.
Glen_b -Reinstate Monica
2
+1 Regresi tertimbang adalah ide yang bagus. Beberapa penyesuaian statistik output, seperti perkiraan kesalahan RMS, mungkin diperlukan.
whuber
s2FR2
Terima kasih atas jawaban Anda Glen_b, walaupun saya telah menerima @whuber, saya masih belajar banyak dari Anda.
Spacey