Meskipun saya membaca posting ini , saya masih tidak tahu bagaimana menerapkan ini pada data saya sendiri dan berharap seseorang dapat membantu saya.
Saya memiliki data berikut:
y <- c(11.622967, 12.006081, 11.760928, 12.246830, 12.052126, 12.346154, 12.039262, 12.362163, 12.009269, 11.260743, 10.950483, 10.522091, 9.346292, 7.014578, 6.981853, 7.197708, 7.035624, 6.785289, 7.134426, 8.338514, 8.723832, 10.276473, 10.602792, 11.031908, 11.364901, 11.687638, 11.947783, 12.228909, 11.918379, 12.343574, 12.046851, 12.316508, 12.147746, 12.136446, 11.744371, 8.317413, 8.790837, 10.139807, 7.019035, 7.541484, 7.199672, 9.090377, 7.532161, 8.156842, 9.329572, 9.991522, 10.036448, 10.797905)
t <- 18:65
Dan sekarang saya hanya ingin menyesuaikan gelombang sinus
dengan empat tidak diketahui , , dan untuk itu.ω ϕ C
Sisa dari kode saya terlihat adalah sebagai berikut
res <- nls(y ~ A*sin(omega*t+phi)+C, data=data.frame(t,y), start=list(A=1,omega=1,phi=1,C=1))
co <- coef(res)
fit <- function(x, a, b, c, d) {a*sin(b*x+c)+d}
# Plot result
plot(x=t, y=y)
curve(fit(x, a=co["A"], b=co["omega"], c=co["phi"], d=co["C"]), add=TRUE ,lwd=2, col="steelblue")
Tetapi hasilnya benar-benar buruk.
Saya akan sangat menghargai bantuan apa pun.
Tepuk tangan.
r
regression
fitting
Pascal
sumber
sumber
Jawaban:
Jika Anda hanya ingin perkiraan yang baik dari dan tidak terlalu peduli dengan kesalahan standarnya:ω
(Kecocokan yang lebih baik mungkin akan menjelaskan pencilan dalam seri itu dalam beberapa cara, mengurangi pengaruh mereka.)
---
Jika Anda menginginkan gagasan tentang ketidakpastian di , Anda dapat menggunakan kemungkinan profil ( pdf1 , pdf2 - referensi untuk mendapatkan perkiraan CI atau UK dari kemungkinan profil atau variannya tidak sulit ditemukan)ω
(Atau, Anda dapat memberi makan perkiraan ini ke nls ... dan memulainya yang sudah konvergen.)
sumber
lm(y~sin(2*pi*t)+cos(2*pi*t)
tetapi ini tidak berhasil (cos
istilah selalu 1). Hanya ingin tahu: apa yang dilakukan dua garis pertama (saya tahu ituspectrum
memperkirakan kepadatan spektral)?2*pi*t
spec
dalam TSA mungkin lebih baik (tampaknya memiliki lebih banyak opsi, salah satunya kadang-kadang penting), tetapi dalam hal ini puncak utama berada di tempat yang persis samaspectrum
sehingga saya tidak repot-repot.reslm
kereslm <- lm(y ~ cos(2*pi/per*t)+tan(2*pi/per*t))
tapi itu tidak terlihat benar. ada petunjuk?Ketika saya memasukkannya ke
nls
dalamstart
daftar, saya mendapatkan kurva yang jauh lebih masuk akal, meskipun masih memiliki beberapa bias sistematis.Bergantung pada apa tujuan Anda dengan kumpulan data ini, Anda dapat mencoba meningkatkan kecocokan dengan menambahkan istilah tambahan atau menggunakan pendekatan nonparametrik seperti proses Gaussian dengan kernel berkala.
Memilih nilai awal secara otomatis
Jika Anda ingin memilih frekuensi yang dominan, Anda dapat menggunakan fast Fourier transform (FFT). Ini adalah jalan keluar dari bidang keahlian saya, jadi saya akan membiarkan orang lain mengisi rincian jika mereka mau (terutama tentang langkah 2 dan 3), tetapi
R
kode di bawah ini akan berfungsi.Anda juga dapat merencanakan
abs(truncated.fft)
untuk melihat apakah ada frekuensi penting lainnya, tetapi Anda harus sedikit bermain-main dengan penskalaan sumbu-x.Juga, saya percaya @Glen_b benar bahwa masalahnya cembung setelah Anda tahu omega (atau mungkin Anda perlu tahu phi juga? Saya tidak yakin). Bagaimanapun, mengetahui nilai awal untuk parameter lain seharusnya tidak sepenting untuk omega jika mereka berada di stadion baseball yang tepat. Anda mungkin bisa mendapatkan perkiraan yang layak dari parameter lain dari FFT, tapi saya tidak yakin bagaimana cara kerjanya.
sumber
foo.bar
. Ini karena bagaimana R menentukan metode untuk kelas .Sebagai alternatif dari apa yang telah dikatakan, mungkin perlu dicatat bahwa model AR (2) dari kelas model ARIMA dapat digunakan untuk menghasilkan perkiraan dengan pola gelombang sinus.
Panratz (1991) memberi tahu kita hal berikut tentang siklus stokastik:
Untuk melihat apakah model seperti itu dapat dipasang ke data saya menggunakan
auto.arima()
fungsi dari paket perkiraan untuk mengetahui apakah itu akan menyarankan model AR (2). Ternyataauto.arima()
fungsi menyarankan model ARMA (2,2); bukan model AR (2) murni, tapi ini OK. Tidak apa-apa karena model ARMA (2,2) berisi komponen AR (2), jadi aturan yang sama (tentang siklus stokastik) berlaku. Artinya, kita masih dapat memeriksa kondisi tersebut untuk melihat apakah prakiraan gelombang sinus akan diproduksi.Hasilnya
auto.arima(y)
ditunjukkan di bawah ini.Plot di bawah ini menunjukkan seri asli, y, kesesuaian model ARMA (2,2), dan 14 perkiraan out-of-sample. Seperti yang dapat dilihat, perkiraan out-of-sample mengikuti pola gelombang sinus.
Ingat dua hal. 1) Ini hanya analisis yang sangat cepat (menggunakan alat otomatis) dan perawatan yang tepat akan melibatkan mengikuti metodologi Box-Jenkins. 2) Perkiraan ARIMA bagus dalam peramalan jangka pendek, sehingga Anda dapat menemukan bahwa ramalan jangka panjang dari model dalam jawaban oleh @ David J. Harris dan @Glen_b agar lebih andal.
Terakhir, semoga ini adalah tambahan yang bagus untuk beberapa jawaban yang sudah sangat informatif.
Referensi : Peramalan dengan model regresi dinamis: Alan Pankratz, 1991, (John Wiley and Sons, New York), ISBN 0-471-61528-5
sumber
Metode saat ini untuk mencocokkan kurva dosa ke set data yang diberikan membutuhkan tebakan pertama parameter, diikuti oleh proses interatif. Ini adalah masalah regresi non-linear. Metode yang berbeda terdiri dari transformasi regresi non-linear menjadi regresi linier berkat persamaan integral yang nyaman. Kemudian, tidak perlu untuk menebak awal dan tidak perlu untuk proses berulang: pemasangan langsung diperoleh. Dalam hal fungsi y = a + r * sin (w * x + phi) atau y = a + b * sin (w * x) + c * cos (w * x), lihat halaman 35-36 kertas "Régress sinusoidale" diterbitkan di Scribd: http://www.scribd.com/JJacquelin/documents Dalam hal fungsi y = a + p * x + r * sin (w * x + phi): halaman 49-51 dari bab "Regresi linier dan sinusoidal campuran". Dalam hal fungsi yang lebih rumit, proses umum dijelaskan dalam bab "Regenerasi sinusoidal umum" halaman 54-61, diikuti oleh contoh numerik y = r * sin (w * x + phi) + (b / x) + c * ln (x), halaman 62-63
sumber
Jika Anda mengetahui titik terendah dan tertinggi dari data yang tampak kosinus, Anda dapat menggunakan fungsi sederhana ini untuk menghitung semua koefisien kosinus:
Di bawahnya digunakan untuk mensimulasikan variasi suhu sepanjang hari dengan fungsi kosinus, dengan memasukkan nilai jam dan suhu untuk jam terendah dan terhangat:
Outputnya di bawah ini:
sumber
Pilihan lain adalah menggunakan fungsi generik optim atau nls. Saya sudah mencoba keduanya tidak ada yang benar-benar kuat
Fungsi-fungsi berikut ini mengambil data dalam y dan menghitung parameter.
penggunaannya adalah sebagai berikut:
Kode berikut membandingkan data
sumber