Obwohl ich diesen Beitrag gelesen habe, weiß ich immer noch nicht, wie ich das auf meine eigenen Daten anwenden soll, und hoffe, dass mir jemand helfen kann.
Ich habe folgende Daten:
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
Und jetzt möchte ich einfach eine Sinuswelle anpassen
mit den vier Unbekannten , , und dazu.
Der Rest meines Codes sieht folgendermaßen aus
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")
Aber das Ergebnis ist wirklich schlecht.
Ich würde mich über jede Hilfe sehr freuen.
Prost.
r
regression
fitting
Pascal
quelle
quelle
Antworten:
Wenn Sie nur eine gute Schätzung von wünschen und sich nicht für den Standardfehler interessieren:ω
(Eine noch bessere Anpassung würde vielleicht die Ausreißer in dieser Reihe in irgendeiner Weise erklären und ihren Einfluss verringern.)
---
Wenn Sie eine Vorstellung von der Unsicherheit in möchten , können Sie die Profilwahrscheinlichkeit verwenden ( pdf1 , pdf2 - Referenzen zum Abrufen von ungefähren CIs oder SEs aus der Profilwahrscheinlichkeit oder ihren Varianten sind nicht schwer zu finden).ω
(Alternativ können Sie diese Schätzungen in nls eingeben ... und es bereits konvergiert starten.)
quelle
lm(y~sin(2*pi*t)+cos(2*pi*t)
aber das hat nicht funktioniert (cos
Term war immer 1). Nur aus Neugier: Was machen die ersten beiden Linien (ich weiß, dass siespectrum
die spektrale Dichte schätzen)?2*pi*t
zu arbeiten. Ich sollte zurückgehen und das in der anderen Antwort betonen. (ctd)spec
in TSA ist vielleicht besser (es scheint mehr Optionen zu geben, von denen eine manchmal wichtig sein kann), aber in diesem Fall war der Hauptpeak genau an der gleichen Stelle wie bei,spectrum
also habe ich mich nicht darum gekümmert.reslm
,reslm <- lm(y ~ cos(2*pi/per*t)+tan(2*pi/per*t))
aber das sieht nicht richtig aus. irgendwelche Hinweise?Als ich das auf
nls
diestart
Liste setzte, bekam ich eine Kurve, die viel vernünftiger war, obwohl sie immer noch einige systematische Vorurteile aufweist.Je nachdem, welches Ziel Sie mit diesem Datensatz verfolgen, können Sie versuchen, die Anpassung zu verbessern, indem Sie zusätzliche Terme hinzufügen oder einen nichtparametrischen Ansatz wie einen Gaußschen Prozess mit einem periodischen Kernel verwenden.
Startwert automatisch wählen
Wenn Sie die dominante Frequenz auswählen möchten, können Sie eine schnelle Fourier-Transformation (FFT) verwenden. Dies liegt außerhalb meines Fachgebiets, sodass andere Leute die Details eintragen können, wenn sie dies wünschen (insbesondere zu den Schritten 2 und 3), aber der folgende
R
Code sollte funktionieren.Sie können auch zeichnen, um
abs(truncated.fft)
zu sehen, ob es andere wichtige Frequenzen gibt, aber Sie müssen ein wenig mit der Skalierung der x-Achse herumspielen.Außerdem glaube ich, dass @Glen_b richtig ist, dass das Problem konvex ist, sobald Sie Omega kennen (oder müssen Sie vielleicht auch Phi kennen? Ich bin nicht sicher). In jedem Fall sollte die Kenntnis der Startwerte für die anderen Parameter nicht annähernd so wichtig sein wie für Omega, wenn sie sich im richtigen Ballpark befinden. Sie könnten wahrscheinlich anständige Schätzungen der anderen Parameter von der FFT erhalten, aber ich bin nicht sicher, wie das funktionieren würde.
quelle
foo.bar
. Dies liegt daran, wie R Methoden für Klassen angibt .Als Alternative zu dem, was bereits gesagt wurde, kann angemerkt werden, dass ein AR (2) -Modell aus der Klasse der ARIMA-Modelle verwendet werden kann, um Vorhersagen mit einem Sinuswellenmuster zu generieren.
Panratz (1991) erzählt uns folgendes über stochastische Zyklen:
Um zu sehen, ob ein solches Modell an die Daten angepasst werden kann, habe ich die
auto.arima()
Funktion aus dem Prognosepaket verwendet, um herauszufinden, ob es ein AR (2) -Modell vorschlagen würde. Es stellt sich heraus, dass dieauto.arima()
Funktion ein ARMA (2,2) -Modell vorschlägt; kein reines AR (2) Modell, aber das ist OK. Dies ist in Ordnung, da ein ARMA (2,2) -Modell eine AR (2) -Komponente enthält. Daher gilt dieselbe Regel (für stochastische Zyklen). Das heißt, wir können immer noch die oben genannte Bedingung überprüfen, um festzustellen, ob Sinuswellenvorhersagen erstellt werden.Die Ergebnisse von
auto.arima(y)
sind unten gezeigt.Das folgende Diagramm zeigt die Originalserie, y, die Passform des ARMA (2,2) -Modells und 14 Prognosen außerhalb der Stichprobe. Wie zu sehen ist, folgen die Vorhersagen außerhalb der Stichprobe einem Sinuswellenmuster.
Beachten Sie zwei Dinge. 1) Dies ist nur eine sehr schnelle Analyse (unter Verwendung eines automatisierten Tools), und eine ordnungsgemäße Behandlung würde die Befolgung der Box-Jenkins-Methodik erfordern. 2) ARIMA-Vorhersagen eignen sich gut für Kurzzeitvorhersagen. Sie können daher feststellen, dass Langzeitvorhersagen aus den Modellen in den Antworten von @David J. Harris und @Glen_b zuverlässiger sind.
Hoffentlich ist dies eine schöne Ergänzung zu einigen bereits sehr informativen Antworten.
Referenz : Vorhersage mit dynamischen Regressionsmodellen: Alan Pankratz, 1991 (John Wiley und Söhne, New York), ISBN 0-471-61528-5
quelle
Die derzeitigen Methoden zum Anpassen einer Sinuskurve an einen bestimmten Datensatz erfordern ein erstes Erraten der Parameter, gefolgt von einem interaktiven Prozess. Dies ist ein nichtlineares Regressionsproblem. Eine andere Methode besteht darin, die nichtlineare Regression durch eine geeignete Integralgleichung in eine lineare Regression umzuwandeln. Dann ist keine erste Vermutung und kein iterativer Prozess erforderlich: Die Anpassung wird direkt erhalten. Für die Funktion y = a + r * sin (w * x + phi) oder y = a + b * sin (w * x) + c * cos (w * x) siehe Seiten 35-36 des Papiers "Régression sinusoidale", veröffentlicht auf Scribd: http://www.scribd.com/JJacquelin/documents Bei der Funktion y = a + p * x + r * sin (w * x + phi): Seite 49-51 des Kapitels "Gemischte lineare und sinusförmige Regressionen". Bei komplexeren Funktionen wird der allgemeine Vorgang im Kapitel "Generalisierte sinusförmige Regression" auf den Seiten 54-61 erläutert, gefolgt von einem Zahlenbeispiel y = r * sin (w * x + phi) + (b / x) + c * ln (x), Seiten 62-63
quelle
Wenn Sie den niedrigsten und höchsten Punkt Ihrer Kosinus-Daten kennen, können Sie mit dieser einfachen Funktion alle Kosinus-Koeffizienten berechnen:
Im Folgenden wird die Veränderung der Temperatur über den Tag mit einer Kosinusfunktion simuliert, indem die Stunden und Temperaturwerte für die niedrigste und wärmste Stunde eingegeben werden:
Die Ausgabe ist unten:
quelle
Eine andere Option ist die Verwendung der generischen Funktion optim oder nls. Ich habe beide ausprobiert, keiner von ihnen ist völlig robust
Die folgenden Funktionen übernehmen die Daten in y und berechnen die Parameter.
Die Verwendung ist die folgende:
Der folgende Code vergleicht die Daten
quelle