Saya mencoba menggunakan R untuk menghitung rata-rata bergerak atas serangkaian nilai dalam sebuah matriks. Pencarian milis R normal belum sangat membantu. Sepertinya tidak ada fungsi bawaan di R yang akan memungkinkan saya menghitung rata-rata bergerak. Apakah ada paket yang menyediakannya? Atau apakah saya perlu menulis sendiri?
r
moving-average
r-faq
Jared
sumber
sumber
forecast::ma
dan itu berisi semua lingkungan, tidak benar.Atau Anda cukup menghitungnya menggunakan filter, inilah fungsi yang saya gunakan:
Jika Anda menggunakan
dplyr
, berhati-hatilah untuk menentukanstats::filter
fungsi di atas.sumber
stats::filter
sides = 2
setara dengan menyelaraskan = "pusat" untuk kebun binatang :: rollmean atau RcppRoll :: roll_mean.sides = 1
setara dengan perataan "benar". Saya tidak melihat cara untuk melakukan perataan "kiri" atau menghitung dengan data "parsial" (2 nilai atau lebih)?Penggunaan
cumsum
harus memadai dan efisien. Dengan asumsi Anda memiliki vektor x dan Anda ingin jumlah n angka yang berjalanSebagaimana ditunjukkan dalam komentar oleh @mzuther, ini mengasumsikan bahwa tidak ada NAS dalam data. untuk mengatasinya akan membutuhkan pembagian setiap jendela dengan jumlah nilai non-NA. Inilah satu cara untuk melakukan itu, memasukkan komentar dari @Ricardo Cruz:
Ini masih memiliki masalah bahwa jika semua nilai di jendela adalah NA maka akan ada pembagian dengan kesalahan nol.
sumber
cumsum(c(1:3,NA,1:3))
cx <- c(0, cumsum(ifelse(is.na(x), 0, x)))
.Dalam data.tabel 1.12.0
frollmean
fungsi baru telah ditambahkan untuk menghitung rolling yang cepat dan tepat berarti penangananNA
,NaN
dan+Inf
,-Inf
nilai-nilai secara cermat .Karena tidak ada contoh yang dapat direproduksi dalam pertanyaan, maka tidak banyak lagi yang perlu dibahas di sini.
Anda dapat menemukan lebih banyak info tentang
?frollmean
secara manual, juga tersedia online di?frollmean
.Contoh dari manual di bawah ini:
sumber
The
caTools
paket telah sangat cepat bergulir berarti / min / max / sd dan beberapa fungsi lainnya. Saya hanya bekerja denganrunmean
danrunsd
dan mereka adalah yang tercepat dari paket lain yang disebutkan sampai saat ini.sumber
Anda bisa menggunakan
RcppRoll
rata-rata bergerak sangat cepat yang ditulis dalam C ++. Panggil sajaroll_mean
fungsinya. Documents dapat ditemukan di sini .Kalau tidak, ini (lebih lambat) untuk loop harus melakukan trik:
sumber
res = arr
. Lalu ada loop yang dimulai mulai darin
atau, elemen ke-15, ke ujung array. itu berarti bagian pertama yang diambilnya adalaharr[1:15]
yang mengisi titikres[15]
. Sekarang, saya lebih suka pengaturanres = rep(NA, length(arr))
daripadares = arr
setiap elemenres[1:14]
sama dengan NA daripada angka, di mana kami tidak bisa mengambil rata-rata penuh dari 15 elemen.Padahal
RcppRoll
sangat bagus.Kode yang diposting oleh cantdutchini harus diperbaiki pada baris keempat ke jendela diperbaiki:
Cara lain, yang menangani kerugian, diberikan di sini .
Cara ketiga, memperbaiki kode cantdutch ini untuk menghitung rata-rata parsial atau tidak, mengikuti:
sumber
Untuk melengkapi jawaban cantdutchthis dan Rodrigo Remedio ;
sumber
Berikut adalah contoh kode yang menunjukkan cara menghitung rata-rata bergerak terpusat dan rata-rata bergerak tertinggal menggunakan
rollmean
fungsi dari paket kebun binatang .sumber
Meskipun agak lambat tetapi Anda juga dapat menggunakan zoo :: rollapply untuk melakukan perhitungan pada matriks.
di mana x adalah kumpulan data, FUN = mean adalah fungsinya; Anda juga dapat mengubahnya ke min, maks, sd dll dan lebar adalah jendela bergulir.
sumber
set.seed(123); x <- rnorm(1000); system.time(apply(embed(x, 5), 1, mean)); library(zoo); system.time(rollapply(x, 5, mean))
Di komputer saya, kecepatannya sangat cepat sehingga mengembalikan waktu 0 detik.Satu dapat menggunakan
runner
paket untuk memindahkan fungsi. Dalam hal inimean_run
berfungsi. Masalah dengan itucummean
adalah bahwa ia tidak menanganiNA
nilai, tetapimean_run
tidak.runner
paket juga mendukung seri waktu yang tidak teratur dan windows dapat bergantung pada tanggal:Satu juga dapat menentukan opsi lain seperti
lag
, dan hanya menggulungat
indeks tertentu. Lebih banyak dalam dokumentasi paket dan fungsi .sumber
Paket slider dapat digunakan untuk ini. Ini memiliki antarmuka yang telah dirancang khusus agar terasa mirip dengan purrr. Ini menerima fungsi sewenang-wenang, dan dapat mengembalikan segala jenis output. Frame data bahkan diulang lebih dari baris bijaksana. Situs pkgdown ada di sini .
Overhead slider dan data.table
frollapply()
harus cukup rendah (jauh lebih cepat daripada kebun binatang).frollapply()
terlihat sedikit lebih cepat untuk contoh sederhana ini di sini, tetapi perhatikan bahwa itu hanya membutuhkan input numerik, dan output harus berupa nilai numerik skalar. fungsi slider sepenuhnya generik, dan Anda dapat mengembalikan tipe data apa pun.sumber
sumber