Saya memiliki beberapa data yang ingin saya smoothkan sehingga poin yang dihaluskan menurun secara monoton. Data saya menurun tajam dan kemudian mulai naik. Berikut ini contoh menggunakan R
df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))
ggplot(df, aes(x=x, y=y))+geom_line()
Apa teknik smoothing yang baik yang bisa saya gunakan? Juga, alangkah baiknya jika saya bisa memaksa titik 1 yang dihaluskan agar mendekati titik yang saya amati.
plot(y~x,data=df); f=fitted( glm( y~ns(x,df=4), data=df,family=quasipoisson)); lines(df$x,f)
Jawaban:
Anda dapat melakukan ini menggunakan splines yang dihukum dengan batasan monotonisitas melalui
mono.con()
danpcls()
fungsi dalam paket mgcv . Ada sedikit yang perlu dilakukan karena fungsi-fungsi ini tidak ramah penggunagam()
, tetapi langkah-langkahnya ditunjukkan di bawah ini, sebagian besar didasarkan pada contoh dari?pcls
, dimodifikasi agar sesuai dengan data sampel yang Anda berikan:Sekarang kita perlu mengisi objek yang diteruskan ke
pcls()
berisi rincian model dibatasi hukuman yang ingin kita muatSekarang kita akhirnya bisa melakukan pemasangan
p
berisi vektor koefisien untuk fungsi dasar yang berhubungan dengan spline. Untuk memvisualisasikan spline yang dipasang, kita dapat memprediksi dari model di 100 lokasi pada rentang x. Kami melakukan 100 nilai untuk mendapatkan garis halus yang bagus di plot.Untuk menghasilkan nilai-nilai prediksi yang kami gunakan
Predict.matrix()
, yang menghasilkan matriks sehingga ketika banyak dengan koefisienp
menghasilkan nilai prediksi dari model yang dipasang:Ini menghasilkan:
Saya akan menyerahkan kepada Anda untuk mendapatkan data ke dalam formulir yang rapi untuk diplot dengan ggplot ...
Anda dapat memaksakan kecocokan yang lebih dekat (untuk menjawab sebagian pertanyaan Anda tentang memiliki yang lebih halus cocok dengan titik data pertama) dengan meningkatkan dimensi fungsi dasar
x
. Misalnya, pengaturank
sama dengan8
(k <- 8
) dan jalankan kembali kode di atas yang kita dapatkanAnda tidak dapat mendorong
k
lebih tinggi untuk data ini, dan Anda harus berhati-hati tentang pemasangan yang berlebihan; semuapcls()
lakukan adalah menyelesaikan masalah kuadrat terkecil yang diberikan kendala dan fungsi dasar yang disediakan, itu tidak melakukan pemilihan kelancaran untuk Anda - bukan yang saya tahu ...)Jika Anda ingin interpolasi, maka lihat fungsi dasar R
?splinefun
yang memiliki spline Hermite dan splines kubik dengan kendala monotonik. Namun dalam hal ini Anda tidak dapat menggunakan ini karena datanya tidak sepenuhnya monoton.sumber
splinefun
adalah pemikiran awal saya juga (saya interpolasi) tetapispline(x=df$x, y=df$y, n=nrow(df), method="monoH.FC")
danspline(x=df$x, y=df$y, n=nrow(df), method="hyman")
keduanya meningkatkan kesalahan?mono.con
memiliki rincian lebih lanjut tentang metode ini.splinefun
memunculkan kesalahan; Saya baru saja menyadari, Anda dapat menyesuaikan spline monoton yang menginterpolasi data yang bukan monoton itu sendiri. Pengamatan dix = 6
lebih besary
dari pengamatan dix = 5
. Anda hanya perlu mengabaikan bagian dari jawaban itu :-)mono.con
mengembalikan spline kubik.?pcls
memiliki contoh untuk spline pelat tipis dan model aditif yang kurang ramah pengguna daripada yang di atas, tetapi yang mungkin mengekspos lebih banyak matematika jika Anda terbiasa dengan matematika untuk jenis-jenis spline (saya sendiri tidak begitu akrab).Paket penipuan baru-baru ini oleh Natalya Pya dan berdasarkan pada makalah "Bentuk model aditif terbatas" oleh Pya & Wood (2015) dapat membuat bagian dari proses yang disebutkan dalam jawaban luar biasa Gavin menjadi lebih mudah.
Ada sejumlah fungsi bs yang dapat Anda gunakan - di atas saya menggunakan mpd untuk "monotonik penurunan P-spline" tetapi juga memiliki fungsi yang menegakkan cembung atau cekung baik secara terpisah atau bersamaan dengan kendala monotonik.
sumber