Pada dasarnya yang ingin saya lakukan adalah memprediksi respons skalar menggunakan beberapa kurva. Saya sudah sejauh melakukan regresi (menggunakan fRegress dari paket fda) tetapi tidak tahu bagaimana menerapkan hasil ke set kurva BARU (untuk prediksi).
Saya memiliki N = 536 kurva, dan 536 respons skalar. Inilah yang telah saya lakukan sejauh ini:
- Saya telah membuat dasar untuk kurva.
- Saya telah membuat objek fdPar untuk memperkenalkan penalti
- Saya telah membuat objek fd menggunakan smooth.basis untuk memuluskan kurva dengan penalti yang dipilih pada dasar yang ditentukan.
- Saya telah menjalankan regresi menggunakan fRegress (), mundur kurva pada respon skalar.
Sekarang, yang ingin saya lakukan adalah menggunakan regresi itu untuk menghasilkan prediksi untuk set data baru yang saya miliki. Sepertinya saya tidak dapat menemukan cara mudah untuk melakukan ini.
Bersulang
predict.fRegress
menggunakannewdata
opsi (dari manual FDA disini )?fda
paket itu. Saya menulis respons yang melibatkan prediksi secara manual, tetapi sebagian besar hilang karena tidak menyimpannya. Jika orang lain tidak mengalahkan saya untuk itu, saya harus punya solusi untuk Anda dalam beberapa hari.Jawaban:
Saya tidak peduli dengan
fda
penggunaan struktur objek Inception - like-list-dalam-daftar-dalam-daftar, tetapi tanggapan saya akan mematuhi sistem yang telah dibuat oleh penulis paket.Saya pikir itu penting untuk pertama-tama berpikir tentang apa yang sedang kita lakukan sebenarnya. Berdasarkan uraian Anda tentang apa yang telah Anda lakukan sejauh ini, inilah yang saya yakin Anda lakukan (beri tahu saya jika saya salah mengartikan sesuatu). Saya akan terus menggunakan notasi dan, karena kurangnya data nyata, contoh dari Analisis Data Fungsional Ramsay dan Silverman dan Analisis Data Fungsional Ramsay, Hooker, dan Graves dengan R dan MATLAB (Beberapa persamaan dan kode berikut diangkat langsung dari buku-buku ini).
Kami memodelkan respons skalar melalui model linier fungsional, yaitu
Kami memperluas dengan dasar tertentu. Kami menggunakan, katakanlah, fungsi berbasisBegitu,Kβ K
Dalam notasi matriks, ini adalah .β(s)=θ′(s)b
Kami juga memperluas fungsi kovariat dalam beberapa basis, juga (misalkan fungsi basis ). Begitu,L
Sekali lagi, dalam notasi matriks, ini adalah .X(s)=Cψ(s)
Dan dengan demikian, jika kita membiarkan , model kita dapat dinyatakan sebagaiJ=∫ψ(s)θ′(s)ds
Dan jika kita membiarkan dan , model kami adalahZ=[1CJ] ξ=[β0b′]′
Dan ini terlihat jauh lebih akrab bagi kita.
Sekarang saya melihat Anda menambahkan semacam regularisasi. The
fda
paket bekerja dengan hukuman kekasaran bentukuntuk beberapa operator linear diferensial . Sekarang dapat ditunjukkan (detail ditinggalkan di sini - benar-benar tidak sulit untuk menunjukkan ini) bahwa jika kita mendefinisikan matriks penalti sebagaiL R
di mana adalah dalam hal perluasan dasar , maka kami meminimalkan jumlah kotak yang terkena penalti:Ri βi
dan masalah kita hanyalah regresi ridge dengan solusi:
Saya berjalan di atas karena, (1) Saya pikir penting untuk memahami apa yang kami lakukan, dan (2) beberapa di atas diperlukan untuk memahami beberapa kode yang akan saya gunakan nanti. Aktif ke kode ...
Berikut ini contoh data dengan kode R. Saya menggunakan dataset cuaca Kanada yang disediakan dalam
fda
paket. Kami akan memodelkan curah hujan tahunan log untuk sejumlah stasiun cuaca melalui model linier fungsional dan kami akan menggunakan profil suhu (suhu dicatat sekali sehari selama 365 hari) dari masing-masing stasiun sebagai kovariat fungsional. Kami akan melanjutkan dengan cara yang Anda uraikan dalam situasi Anda. Data direkam di 35 stasiun. Saya akan memecah dataset menjadi 34 stasiun, yang akan digunakan sebagai data saya, dan stasiun terakhir, yang akan menjadi dataset "baru" saya.Saya melanjutkan melalui kode R dan komentar (saya berasumsi Anda cukup akrab dengan
fda
paket sehingga tidak ada yang berikut ini yang mengejutkan - jika ini tidak terjadi, tolong beri tahu saya):Sekarang ketika saya pertama kali diajarkan tentang data fungsional setahun yang lalu, saya bermain-main dengan paket ini. Saya juga tidak bisa
predict.fRegress
memberikan apa yang saya inginkan. Melihat ke belakang sekarang, saya masih tidak tahu bagaimana membuatnya berperilaku. Jadi, kita hanya perlu mendapatkan prediksi semi-manual. Saya akan menggunakan potongan yang saya tarik langsung dari kodefRegress()
. Sekali lagi, saya melanjutkan melalui kode dan komentar.Pertama, pengaturannya:
Sekarang untuk mendapatkan prediksi
Saya hanya mengambil kode yang∫T0Xi(s)β(s) Xi β
fRegress
digunakan untuk menghitungyhatfdobj
dan mengeditnya sedikit.fRegress
menghitungyhatfdobj
dengan memperkirakan integral melalui aturan trapesium (dengan dan diperluas di basis masing-masing).Biasanya,
fRegress
hitung nilai-nilai yang dipasang dengan mengulang melalui kovariat yang disimpanannPrecTemp$xfdlist
. Jadi untuk masalah kami, kami mengganti daftar kovariat ini dengan yang sesuai dalam daftar kovariat baru kami, yaitutemplistNew
,. Berikut kodenya (identik dengan kode yang ditemukanfRegress
dengan dua pengeditan, beberapa penghapusan kode yang tidak dibutuhkan, dan beberapa komentar ditambahkan):(catatan: jika Anda melihat kode chunk dan sekitarnya ini
fRegress
, Anda akan melihat langkah-langkah yang saya uraikan di atas).Saya menguji kode dengan menjalankan kembali contoh cuaca menggunakan semua 35 stasiun sebagai data kami dan membandingkan output dari loop di atas
annPrecTemp$yhatfdobj
dan semuanya cocok. Saya juga menjalankannya beberapa kali menggunakan stasiun yang berbeda sebagai data "baru" saya dan semuanya tampak masuk akal.Beri tahu saya jika ada di atas yang tidak jelas atau ada yang tidak berfungsi dengan benar. Maaf atas tanggapan yang terlalu rinci. Saya tidak bisa menahan diri :) Dan jika Anda belum memilikinya, lihat dua buku yang saya gunakan untuk menulis tanggapan ini. Buku-buku itu sangat bagus.
sumber
nfine
dan melihat berapa banyak perubahan integral tetapi saya kira itu tidak akan banyak membantu. Sejauh hukuman, ya kami langsung menghukum bukan dalam kasus ini. Ramsay dan Silverman membahas metode penalti lain yang memperkirakan tanpa fungsi dasar di mana kami menerapkan penalti langsung ke . Kedua cara menginduksi kendala kelancaran pada fungsi , tapi saya tidak yakin apakah Anda akan mendapatkan 'efek yang sama.'