Bagaimana cara menemukan nilai p dari regresi spline / loess halus?

10

Saya memiliki beberapa variabel dan saya tertarik untuk menemukan hubungan non-linear di antara mereka. Jadi saya memutuskan untuk memasang spline atau loess, dan mencetak plot yang bagus (lihat kode di bawah). Tapi, saya juga ingin memiliki beberapa statistik yang memberi saya ide seberapa besar kemungkinan hubungan itu adalah masalah keacakan ... yaitu, saya memerlukan beberapa nilai p keseluruhan, seperti yang saya miliki untuk regresi linier misalnya. Dengan kata lain, saya perlu tahu apakah kurva yang dipasang masuk akal, karena kode saya akan cocok dengan kurva untuk data apa pun.

x <- rnorm(1000)
y <- sin(x) + rnorm(1000, 0, 0.5)

cor.test(x,y)
plot(x, y, xlab = xlab, ylab = ylab)
spl1 <- smooth.spline(x, y, tol = 1e-6, df = 8)
lines(spl1, col = "green", lwd = 2)

spl2 <- loess(y ~ x)
x.pr <- seq(min(x), max(x), length.out = 100)
lines(x.pr, predict(spl2, x.pr), col = "blue", lwd = 2)
Ingin tahu
sumber

Jawaban:

8

Pustaka splines memiliki fungsi bsdan nsyang akan membuat basis spline untuk digunakan dengan lmfungsi tersebut, maka Anda dapat menyesuaikan model linier dan model termasuk splines dan menggunakan anovafungsi tersebut untuk melakukan tes model penuh dan tereduksi untuk melihat apakah model spline cocok secara signifikan lebih baik dari model linier.

Berikut ini beberapa contoh kode:

x <- rnorm(1000)
y <- sin(x) + rnorm(1000, 0, 0.5)

library(splines)

fit1 <- lm(y~x)
fit0 <- lm(y~1)
fit2 <- lm(y~bs(x,5))

anova(fit1,fit2)
anova(fit0,fit2)

plot(x,y, pch='.')
abline(fit1, col='red')
xx <- seq(min(x),max(x), length.out=250)
yy <- predict(fit2, data.frame(x=xx))
lines(xx,yy, col='blue')

Anda juga dapat menggunakan polyfungsi untuk melakukan fit polinomial dan menguji istilah non-linear sebagai tes kelengkungan.

Untuk orang yang kurang fit, ini sedikit lebih rumit. Ada beberapa perkiraan derajat kebebasan yang setara untuk parameter perataan loess yang dapat digunakan bersama dengan nilai untuk model linier dan loess untuk dikonstruksi dan uji F. Saya pikir metode berdasarkan tes bootstrap dan permutasi mungkin lebih intuitif.R2

Ada teknik untuk menghitung dan memplot interval kepercayaan untuk fit loess (saya pikir mungkin ada cara built-in dalam paket ggplot2), Anda dapat merencanakan band kepercayaan dan melihat apakah garis lurus akan cocok di dalam band (ini bukan nilai-p, tetapi masih memberikan ya / tidak.

Anda dapat menyesuaikan model linier dan mengambil residu dan memasukkan model loess ke residual sebagai respons (dan variabel yang diminati sebagai prediktor), jika model yang sebenarnya adalah linier maka kecocokan ini harus dekat dengan garis datar dan menyusun ulang poin. relatif terhadap prediktor seharusnya tidak membuat perbedaan. Anda bisa menggunakan ini untuk membuat tes permutasi. Paskan loess, temukan nilai prediksi terjauh dari 0, sekarang secara acak permutasi poin dan paskan loess baru dan temukan titik prediksi terjauh dari 0, ulangi beberapa kali, p-value adalah proporsi dari nilai yang diijinkan yang lebih jauh dari 0 dari nilai aslinya.

Anda mungkin juga ingin melihat validasi silang sebagai metode pemilihan bandwidth loess. Ini tidak memberikan nilai p, tetapi bandwidth tak terbatas sesuai dengan model linier sempurna, jika validasi silang menunjukkan bandwidth yang sangat besar maka itu menunjukkan model linier mungkin masuk akal, jika bandwidth yang lebih tinggi jelas lebih rendah daripada beberapa bandwidth yang lebih kecil maka ini menunjukkan kelengkungan yang pasti dan linier tidak cukup.

Greg Snow
sumber
Greg terima kasih! Saya pikir paragraf 1 terdengar sebagai cara untuk pergi, kecuali bahwa saya tidak tertarik dibandingkan dengan model linier, hanya untuk melihat apakah spline menjelaskannya atau tidak. Bisakah Anda memberikan beberapa kode atau lebih banyak petunjuk konkret tentang cara menguji spline dengan anova? Saya telah melihat fungsi bs dan ns tetapi saya tidak begitu baik dalam statistik untuk dapat menciptakannya sendiri.
Penasaran
Dan ya saya telah menemukan cara menghitung untuk loess (lihat fibosworld.wordpress.com/2012/11/04/loess-regress-with-r ) tetapi saya tidak tahu cara mengubah menjadi p- nilai ...R 2R2R2
Penasaran
Saya menambahkan beberapa kode contoh untuk anovapendekatan dengan splines. Untuk uji F dari pertimbangkan bahwa adalah SSR dibagi dengan SST dan adalah SSE dibagi dengan SST, sehingga rasio hanya SSR dibagi dengan SSE (2 kasus SST batal). Sertakan derajat kebebasan dan aljabar kecil dan Anda memiliki statistik F untuk regresi keseluruhan. R 2 1 - R 2R2R21R2R21R2
Greg Snow
Greg, terima kasih! 1) Bisakah Anda jelaskan apa yang lm(y~bs(x,5))dilakukan dan mengapa tidak lm(y~I(bs(x,5)))? Saya cukup bingung dengan panggilan ini karena hasil dari bs (x, 5) bukan variabel ... 2) Apakah saya memahaminya dengan benar bahwa nilai p yang saya cari adalah hasil dari anova(fit0,fit2)?
Penasaran
1
Itu hanya melakukan regresi linier. Seperti halnya Anda dapat melakukan regresi linier dengan , , dan agar sesuai dengan kurva berdasarkan polinomial, fungsi tersebut menciptakan transformasi variabel dan meneruskannya ke yang melakukan regresi linier. xx 3 xx2x3bsxlm
Greg Snow