Chociaż czytam ten post, nadal nie mam pojęcia, jak zastosować to do moich danych i mam nadzieję, że ktoś może mi pomóc.
Mam następujące dane:
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
A teraz chcę po prostu dopasować falę sinusoidalną
z czterech niewiadomych , , i do niego.ω ϕ C.
Reszta mojego kodu wygląda następująco
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")
Ale wynik jest naprawdę słaby.
Byłbym bardzo wdzięczny za każdą pomoc.
Twoje zdrowie.
r
regression
fitting
Pascal
źródło
źródło
Odpowiedzi:
Jeśli chcesz tylko dobrze oszacować i nie przejmujesz się jego standardowym błędem:ω
(Nadal lepsze dopasowanie może w jakiś sposób tłumaczyć wartości odstające w tej serii, zmniejszając ich wpływ).
---
Jeśli chcesz mieć pojęcie o niepewności w , możesz użyć prawdopodobieństwa profilu ( pdf1 , pdf2 - odniesienia do uzyskania przybliżonych CI lub SE z prawdopodobieństwa profilu lub jego wariantów nie są trudne do zlokalizowania)ω
(Alternatywnie, możesz podać te szacunki do nls ... i rozpocząć już zbieżne).
źródło
lm(y~sin(2*pi*t)+cos(2*pi*t)
ale to nie zadziałało (cos
termin zawsze wynosił 1). Z ciekawości: co robią pierwsze dwie linie (wiem, żespectrum
szacuje gęstość widmową)?2*pi*t
spec
w TSA może być lepsza (wydaje się, że ma więcej opcji, z których jedna może być czasem ważna), ale w tym przypadku główny szczyt znajdował się dokładnie w tym samym miejscu co,spectrum
więc nie zawracałem sobie głowy.reslm
sięreslm <- lm(y ~ cos(2*pi/per*t)+tan(2*pi/per*t))
, ale to nie wygląda dobrze. jakieś wskazówki?Kiedy kładę, że w
nls
„sstart
listy, mam krzywą, która była znacznie bardziej rozsądne, chociaż nadal ma pewne systematyczne uprzedzeń.W zależności od tego, jaki jest cel tego zestawu danych, możesz spróbować poprawić dopasowanie, dodając dodatkowe warunki lub stosując podejście nieparametryczne, takie jak proces Gaussa z okresowym jądrem.
Automatyczny wybór wartości początkowej
Jeśli chcesz wybrać dominującą częstotliwość, możesz użyć szybkiej transformaty Fouriera (FFT). To jest poza moim obszarem specjalizacji, więc pozwolę innym osobom wypełnić szczegóły, jeśli chcą (szczególnie o krokach 2 i 3), ale
R
poniższy kod powinien działać.Możesz również wykreślić,
abs(truncated.fft)
czy istnieją inne ważne częstotliwości, ale będziesz musiał nieco pogrzebać przy skalowaniu osi x.Uważam też, że @Glen_b ma rację, że problem jest wypukły, gdy znasz omegę (a może też musisz znać phi? Nie jestem pewien). W każdym razie znajomość wartości początkowych dla innych parametrów nie powinna być tak ważna, jak w przypadku omegi, jeśli są one na właściwym miejscu. Prawdopodobnie można uzyskać przyzwoite oszacowania innych parametrów z FFT, ale nie jestem pewien, jak to by działało.
źródło
foo.bar
. Wynika to ze sposobu, w jaki R określa metody dla klas .Jako alternatywę do tego, co już powiedziano, warto zauważyć, że model AR (2) z klasy modeli ARIMA może być wykorzystywany do generowania prognoz z wzorem fali sinusoidalnej.
Panratz (1991) mówi nam o cyklach stochastycznych:
Aby sprawdzić, czy taki model można dopasować do danych, skorzystałem z
auto.arima()
funkcji z pakietu prognozy, aby dowiedzieć się, czy sugerowałby model AR (2). Okazuje się, żeauto.arima()
funkcja sugeruje model ARMA (2,2); nie jest to czysty model AR (2), ale to jest OK. Jest OK, ponieważ model ARMA (2,2) zawiera element AR (2), więc obowiązuje ta sama zasada (o cyklach stochastycznych). Oznacza to, że nadal możemy sprawdzić wyżej wspomniany warunek, aby sprawdzić, czy zostaną wygenerowane prognozy fali sinusoidalnej.Wyniki
auto.arima(y)
pokazano poniżej.Poniższy wykres przedstawia oryginalną serię y, dopasowanie modelu ARMA (2,2) i 14 prognoz poza próbą. Jak można zauważyć, prognozy poza próbą są zgodne z wzorem fali sinusoidalnej.
Pamiętaj o dwóch rzeczach. 1) To tylko bardzo szybka analiza (przy użyciu zautomatyzowanego narzędzia), a właściwe leczenie wymagałoby zastosowania metodologii Boxa-Jenkinsa. 2) Prognozy ARIMA są dobre w prognozowaniu krótkoterminowym, więc może okazać się, że prognozy długoterminowe z modeli w odpowiedziach @Davida J. Harrisa i @Glen_b są bardziej wiarygodne.
Wreszcie, mam nadzieję, że jest to miły dodatek do niektórych już bardzo pouczających odpowiedzi.
Odniesienie : Prognozowanie za pomocą modeli regresji dynamicznej: Alan Pankratz, 1991, (John Wiley and Sons, New York), ISBN 0-471-61528-5
źródło
Obecne metody dopasowania krzywej grzechu do danego zestawu danych wymagają pierwszego odgadnięcia parametrów, a następnie procesu interakcyjnego. Jest to problem regresji nieliniowej. Inna metoda polega na przekształceniu regresji nieliniowej w regresję liniową dzięki wygodnemu równaniu całkowemu. Wtedy nie ma potrzeby wstępnego odgadywania i nie ma potrzeby iteracyjnego procesu: dopasowanie jest uzyskiwane bezpośrednio. W przypadku funkcji y = a + r * sin (w * x + phi) lub y = a + b * sin (w * x) + c * cos (w * x), patrz strony 35-36 artykułu „Régression sinusoidale” opublikowane na Scribd: http://www.scribd.com/JJacquelin/documents W przypadku funkcji y = a + p * x + r * sin (w * x + phi): strony 49–51 rozdziału „Mieszane regresje liniowe i sinusoidalne”. W przypadku bardziej skomplikowanych funkcji ogólny proces wyjaśniono w rozdziale „Uogólniona regresja sinusoidalna” na stronach 54–61, a następnie w przykładzie numerycznym y = r * sin (w * x + phi) + (b / x) + c * ln (x), strony 62-63
źródło
Jeśli znasz najniższy i najwyższy punkt danych wyglądających na cosinus, możesz użyć tej prostej funkcji do obliczenia wszystkich współczynników cosinus:
Poniżej służy do symulacji zmian temperatury w ciągu dnia za pomocą funkcji cosinus, wprowadzając godziny i wartości temperatury dla najniższej i najcieplejszej godziny:
Dane wyjściowe są poniżej:
źródło
Inną opcją jest użycie funkcji ogólnej optim lub nls. Próbowałem obu, ale żaden z nich nie jest całkowicie solidny
Poniższe funkcje pobierają dane w y i obliczają parametry.
zastosowanie jest następujące:
Poniższy kod porównuje dane
źródło