R-Programm Zeitreihenanalyse < Mathe-Software < Mathe < Vorhilfe
|
Guten Tag,
kann mir jmd. helfen bzgl. des R-Programms.
decompose() zerlegt ja eine Zeitreihe in Trend- Saison- und Restkomponente.
Ich soll es jetzt zerlegen ohne den Befehl decompose() zu benutzen anhand des Beispiels UKgas.
also anstelle von decompose(UKgas) der das nun automatisch machen würde, soll ich es jetzt manuell zerlegen.
Hat jemand ne Ahnung wie man das machen würde?
LG
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 13:49 Sa 06.09.2014 | Autor: | luis52 |
Moin, ich weiss im einzelnen nicht wie decompose arbeitet, aber das kriegst du ja raus durch ?decompose.
Ich kann nur vermuten, dass du das Verfahren selbst mit R programmieren sollst.
|
|
|
|
|
Hallo,
nee das war ja nicht die Frage ich weiß ja was decompose() macht der zerlegt ja eine komplette Zeitreihe in mehreren Zeitreihen, also in Trend-, Saison- und Restkomponente dann plottet er das.
Meine Frage wäre eher, wie plotte ich drei Graphen in einen ohne decompose() zu benutzen?
als Bsp: wenn ich plot(UKgas) eintippe plottet der mir UKgas (UKgas ist vorprogrammiert in R)
aber ich brauche ja die Trend-, Saison- und Restkomponente in einem Graphen bzw Bild damit das mit einem Aufruf funktioniert.
LG
|
|
|
|
|
Als Bsp. noch das sind die drei Plots die ich habe:
[mm] plot(d_t, [/mm] main = "Trendkomponente", xlab = "Zeit")
[mm] plot(y_t, [/mm] main = "Saisonkomponente", xlab = "Zeit")
[mm] plot(r_t, [/mm] main = "Restkomponente", xlab = "Zeit")
aber wenn ich die so eintippe zeigt der mir drei verschiedene Plots, aber will ja 3 in 1 haben.
ich hoffe jemand kann mir weiterhelfen :)
LG
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 00:31 So 07.09.2014 | Autor: | Marcel |
Hallo,
> Hallo,
>
> nee das war ja nicht die Frage ich weiß ja was decompose()
> macht der zerlegt ja eine komplette Zeitreihe in mehreren
> Zeitreihen, also in Trend-, Saison- und Restkomponente
> dann plottet er das.
> Meine Frage wäre eher, wie plotte ich drei Graphen in
> einen ohne decompose() zu benutzen?
> als Bsp: wenn ich plot(UKgas) eintippe plottet der mir
> UKgas (UKgas ist vorprogrammiert in R)
>
> aber ich brauche ja die Trend-, Saison- und Restkomponente
> in einem Graphen bzw Bild damit das mit einem Aufruf
> funktioniert.
entsprechend Deiner anhängenden Mitteilung: Geht es Dir nur um das
plotten mehrerer "Funktionen" in ein gemeinsames KO-System?
(In Matlab würde man "plot(...); hold on; plot(...)" benutzen, oder direkt
beides in den gleichen plot-Befehl schreiben).
Falls ja:
http://stackoverflow.com/questions/2564258/plot-2-graphs-in-same-plot-in-r
Falls nein: Ich lasse mal auf halb beantwortet.
Aber vielleicht präzisierst Du mal, was Du nun eigentlich wissen willst. Ist
das eine selbstgestellte Aufgabe, oder wird die verlangt? Etc. pp., sowas
wäre auch schön, zu wissen...
Gruß,
Marcel
|
|
|
|
|
Hallo,
hat sich erledigt habe es hinbekommen, leider gibt es beim R kein hold on.
Man macht es mit lines(),
also den ersten mit plot() und den zweiten dritten Graphen mit lines().
LG
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:09 So 07.09.2014 | Autor: | Marcel |
Hallo,
> Hallo,
> hat sich erledigt habe es hinbekommen, leider gibt es beim
> R kein hold on.
nein, aber etwas ähnliches.
> Man macht es mit lines(),
>
> also den ersten mit plot() und den zweiten dritten Graphen
> mit lines().
Das war eine Möglichkeit, die in dem Link stand. Es gibt einen Ersatz für
hold on, das steht hier auch:
> plot( x, y1, type="l", col="red" )
> par(new=TRUE)
> plot( x, y2, type="l", col="green" )
Diese Information fand ich eigentlich wichtiger.
(Was genau dieser Befehl macht habe ich mir aber nicht angeguckt, sondern
ihn nur mal kurz getestet...)
Gruß,
Marcel
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 10:33 So 07.09.2014 | Autor: | luis52 |
Moin, es waere von Vorteil gewesen, wenn du deine Frage etwas
mehr auf den Punkt formulieren koenntest. Anscheinend geht es dir
um das Plotten ...
> nee das war ja nicht die Frage ich weiß ja was decompose()
> macht der zerlegt ja eine komplette Zeitreihe in mehreren
> Zeitreihen, also in Trend-, Saison- und Restkomponente
> dann plottet er das.
Bei *mir* wird nichts geplottet. Ich erhalte eine fuenfelementige Liste, u.a. mit den Komponenten "seasonal", "trend", und "random". Das passiert erst mit
1: | plot(decompose(UKgas))
|
> Meine Frage wäre eher, wie plotte ich drei Graphen in
> einen ohne decompose() zu benutzen?
> als Bsp: wenn ich plot(UKgas) eintippe plottet der mir
> UKgas (UKgas ist vorprogrammiert in R)
>
> aber ich brauche ja die Trend-, Saison- und Restkomponente
> in einem Graphen bzw Bild damit das mit einem Aufruf
> funktioniert.
Das macht keinen Sinn, die drei Komponenten haben unterschiedliche Wertebereiche. Im unguenstigsten Fall dominiert die Trendvariable. Aber vielleicht meinst du ja so etwas Unschoenes:
1: | zr <- decompose(UKgas)
| 2: | plot(zr$trend,ylim=c(-210,max(zr$trend,na.rm=TRUE)))
| 3: | lines(zr$random,col="red")
| 4: | lines(zr$seasonal,col="green")
|
|
|
|
|
|
Hallo,
ich habe noch ein Problem.
data(UKgas)
y <- UKgas
p <- 7
x <- if(!p%%2==1) {
rep(1,p)/p
} else {
c(0.5, rep(1, p-1)/p) #Berechnung der geglätteten Zeitreihe
}
so fängt jetzt meine Zeitreihe an.
Bei der if schleife habe ich ein Problem aber ich weiß nicht was.
Ich möchte die geglättete Zeitreihe berechnen.
Da habe ich ja eine gerade Länge und eine ungerade Länge an Perioden.
Wenn eine gerade Länge als p eingetippt wird soll rep(1,p)/p ausgeführt werden. Wenn eine ungerade Länge dann c(0.5, rep(1, p-1)/p) .
aber wenn ich es ausführen lasse kommen immer die gleichen Zahlen fast bei p <- 4 kommt vier mal 0.25 usw. das kann doch gar nicht richtig sein oder?
oder ist mein Ansatz schon falsch?
LG
|
|
|
|
|
hat sich erledigt habe es anders hinbekommen :)
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 21:59 Do 11.09.2014 | Autor: | luis52 |
Vielleicht so:
1: | p <- 5
| 2: | if((p%%2)!=1){#
| 3: | x <- rep(1,p)/p} else {#
| 4: | x <- c(0.5, rep(1, p-1)/p)} #Berechnung der geglätteten Zeitreihe
| 5: | p <- 4
| 6: | if((p%%2)!=1){#
| 7: | x <- rep(1,p)/p} else {#
| 8: | x <- c(0.5, rep(1, p-1)/p)} #Berechnung der geglätteten Zeitreihe
|
|
|
|
|
|
Hallo,
kann mir jemand helfen eine Summenformel bei R zu programmieren.
Wir hatten vor einigen Wochen hier im Forum, einen gleitenden Durchschnitt programmiert für eine ungerade Länge p und eine gerade Länge p.
Der Prof meinte es wäre falsch gewesen.
Datei-Anhang
Oben im Anhang ist auf der zweiten Seite: Einfach gleitender Durchschnitt mit ungeradem p und geradem p. ( p steht für Periodenlänge)
data(UKgas)
y <- UKgas
x <- if(!p%%2==1) {
filter(y,rep(1/p,p))
} else {
#Berechnung der geglätteten Zeitreihe
}
nach dem else soll halt jetzt der gleitende Durchschnitt für eine geraden Länge kommen. Die ungerade Länge scheint glaube ich richtig zu sein. Und ich soll jetzt die Summe für die gerade Länge programmieren die auf Seite 2 zu finden ist.
Hoffe jemand kann mir da helfen.
Dateianhänge: Anhang Nr. 1 (Typ: pdf) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 09:14 Mi 01.10.2014 | Autor: | Diophant |
Hallo,
den obigen Anhang können wir so leider nicht freigeben. Da waren die Angaben zum Urheberrecht falsch und keinerlei Quellenangabe zu sehen.
Entweder du belegst uns klipp und klar die Herkunft der Pdf, so dass nachvollziehbar ist, dass sie nicht urheberrechtlich geschützt ist. Oder du tippst halt die notwendigen Passagen ab, das wäre sicherlich die vernünftigste Lösung.
Gruß, Diophant
|
|
|
|
|
ah sorry tut mir leid,
hier ist die Formel:
$p = 2s $ gerade: Sei $ [mm] a_j [/mm] = [mm] \bruch{1}{2s} [/mm] $
$ j = -s+1,...s-1 $ und $ a_-_s = [mm] a_s [/mm] = [mm] \bruch{1}{4s} [/mm] $
Dann heißt:
$ [mm] y_t^{\;*} [/mm] = [mm] \bruch{1}{2s} (\bruch{y_t_-_s}{2} [/mm] + [mm] \summe_{j=-s+1}^{s-1} y_t_+_j [/mm] + [mm] \bruch{y_t_+_s}{2}) [/mm] $
einfach gleitender Durchschnitt der Ordnung 2s.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 02:24 Do 02.10.2014 | Autor: | Marcel |
Hallo,
> ah sorry tut mir leid,
>
> hier ist die Formel:
> [mm]p = 2s[/mm] gerade: Sei [mm]a_j = \bruch{1}{2s}[/mm]
> [mm]j = -s+1,...s-1[/mm] und [mm]a_-_s = a_s = \bruch{1}{4s}[/mm]
> Dann
> heißt:
> [mm]y_t^{\;*} = \bruch{1}{2s} (\bruch{y_t_-_s}{2} + \summe_{j=-s+1}^{s-1} y_t_+_j + \bruch{y_t_+_s}{2}) [/mm]
>
> einfach gleitender Durchschnitt der Ordnung 2s.
was haben die [mm] $a_j$ [/mm] da für einen Sinn?
Ansonsten:
S.407
Gruß,
Marcel
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 03:13 Do 02.10.2014 | Autor: | Marcel |
Hallo,
> Hallo,
>
> kann mir jemand helfen eine Summenformel bei R zu
> programmieren.
>
> Wir hatten vor einigen Wochen hier im Forum, einen
> gleitenden Durchschnitt programmiert für eine ungerade
> Länge p und eine gerade Länge p.
> Der Prof meinte es wäre falsch gewesen.
>
> Datei-Anhang
>
> Oben im Anhang ist auf der zweiten Seite: Einfach
> gleitender Durchschnitt mit ungeradem p und geradem p. ( p
> steht für Periodenlänge)
>
> data(UKgas)
> y <- UKgas
>
> x <- if(!p%%2==1) {
> filter(y,rep(1/p,p))
> } else {
> #Berechnung der geglätteten Zeitreihe
> }
>
> nach dem else soll halt jetzt der gleitende Durchschnitt
> für eine geraden Länge kommen. Die ungerade Länge
> scheint glaube ich richtig zu sein. Und ich soll jetzt die
> Summe für die gerade Länge programmieren die auf Seite 2
> zu finden ist.
ich habe mal versucht, die Idee zu extrahieren. Ich hätte es zwar auch
direkt in R programmieren können, aber zum einen sollst Du selbst auch
was tun, zum anderen mag ich Octave einfach lieber. Als Beispiel habe
ich einfach selbst den Sinus mal gebastelt.
Was Du sehen wirst ist natürlich, dass die ersten s Stellen des neuen
Feldes (summe) eigentlich leer wären, Octave füllt sie selber mit Nullen.
Und die Schleife, die den Vektor y durchläuft, hört natürlich auch dann
auf, bevor auf ein nicht vorhandenes Element zugegriffen wird. Hier der
Code für Octave (ich empfehle sowieso, sich da reinzuarbeiten):
1: |
| 2: | p=10;
| 3: | s=p/2;
| 4: | x=[0:1/100:pi];
| 5: | y=sin(x);
| 6: | for t=s+1:length(x)-s
| 7: | s=abs(p)/2;
| 8: | summe(t)=0;
| 9: | for j=-s+1:s-1
| 10: | summe(t)=summe(t)+y(t+j);
| 11: | end;
| 12: | summe(t)=summe(t)+y(t-s)/2+y(t+s)/2;
| 13: | summe(t)=summe(t)/(2*s);
| 14: | end
|
Getestet habe ich ihn noch nicht. Und klar: Es ist nicht R, aber betrachte
es wie einen Pseudo-Code:
Es sollte nicht schwer sein, entsprechende Befehle in der passenden
Programmiersprache zu suchen und umzusetzen!
Und, wie gesagt:
summe(1)... summe(5) sollten eigentlich nicht existieren. Der Wert summe(6)
sollte "passend" zu y(6) sein. Aber auch das solltest Du einfach mal
kontrollieren! (Was gibt das Programm aus? Was sagt eine Rechnung
auf Papier?)
P.S. Etwas Vorsicht ist geboten: Die Nummerierung von Feldern startet
mit 1.
D.h.: summe(0) kann es also gar nicht geben! (Ich glaube aber, dass das
in R genauso ist. Ich habe es jedenfalls bei einem Test gerade eigentlich
genau so gesehen...)
Gruß,
Marcel
|
|
|
|
|
Danke für die Hinweise.
Ich habe es nun so gemacht:
x <- if(!p%%2==1) {
filter(y,rep(1/p,p))
} else {
filter(x, filter = c(0.5, rep(1,(2*p-1)), 0,5)/(2 * p)) #Berechnung der geglätteten Zeitreihe
}
nun habe ich ein anderes Problem.
Ich soll nun die Saisonale Komponente schätzen.
dafür brauche ich doch den Mittelwert erstmal.
Berechnung der Mittelwerte pro Spalte:
apply(X_numerisch,2,mean) (Beispiel)
wenn ich bei mir [mm] apply(d_t,2,mean) [/mm] eintippe kommt der Fehler
dim(X) must have a positive length. Es gibt zwar viele Lösungen online zu dem Fehler aber da ich nicht so gut englisch kann verstehe ich nicht, was die dort meinen.
[mm] d_t [/mm] ist meine trendbereinigte Zeitreihe
LG
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:29 Di 07.10.2014 | Autor: | luis52 |
>
> [mm]d_t[/mm] ist meine trendbereinigte Zeitreihe
>
>
Anscheinend ist das Argument (bestimmt nicht [mm] $d_t$) [/mm] keine Matrix, was bei einer Zeitreihe auch nicht ueberrascht.
Was erhaeltst du nach der Eingabe von dim(DeineZeitreihe)?
(Uebrigens ist colMeans(Matrix) besser geeignet.)
|
|
|
|
|
Ja ich habe es jetzt glaube ich hinbekommen.
f <- [mm] matrix(d_t, [/mm] 27, 4, byrow=T)
mittel <- mean(f, na.rm = TRUE)
[mm] s_t [/mm] <- apply(f,2, na.rm = TRUE,mean) #Schätzung der Saisonkomponenten
nur ein Problem habe ich mit der Musterlösung:
Saisonale Komponente:
175.13810 -36.14123 -168.96767 29.97079
Meine Lösung:
175.08173 -36.48611 -172.58750 28.85288
ist es trotzdem so okay oder ist was falsch?
LG
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 20:47 Di 07.10.2014 | Autor: | Marcel |
Hallo,
> Ja ich habe es jetzt glaube ich hinbekommen.
>
> f <- [mm]matrix(d_t,[/mm] 27, 4, byrow=T)
>
> mittel <- mean(f, na.rm = TRUE)
> [mm]s_t[/mm] <- apply(f,2, na.rm = TRUE,mean) #Schätzung der
> Saisonkomponenten
>
> nur ein Problem habe ich mit der Musterlösung:
>
> Saisonale Komponente:
> 175.13810 -36.14123 -168.96767 29.97079
>
> Meine Lösung:
> 175.08173 -36.48611 -172.58750 28.85288
>
> ist es trotzdem so okay oder ist was falsch?
wie sollen wir das wissen, wenn wir die Daten nicht kennen?
Was aber gut ist, ist doch schonmal, dass Deine Lösung sich nicht viel
von der Musterlösung unterscheidet (die dritte und vierte Komponente
sieht allerdings *vergleichsweise* doch schon etwas merkwürdig aus).
Kannst Du Dir nicht ein einfaches Beispiel bauen, dass man mit etwas
Geduld von Hand (oder mit TR) durchrechnen kann - einfach mal, um die
Funktionsfähigkeit Deines Algorithmus zu testen?
Ansonsten auch einfach mal mit "help" (bei R kann man das mit einem
"Fragezeichen" machen, glaube ich) mal ein wenig die Doku lesen und
schauen, ob alles auch so gemacht wird, wie es gemacht werden soll.
So weiß ich z.B. bei Matlab, dass man auf zwei Arten die Varianz (oder
Standardabweichung) berechnen kann. Ab und an sollte man halt auch
einfach mal die Dokumentationen lesen und verstehen.
Gruß,
Marcel
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 09:52 Do 09.10.2014 | Autor: | ellegance88 |
Hallo nochmal,
y <- UKgas
p <- 4
x <- if(!p%%2==1) {
filter(y,rep(1/p,p))
} else {
filter(y, filter = c(0.5, rep(1,(2*p-1)), 0,5)/(2 * p)) #Berechnung der geglätteten Zeitreihe
}
[mm] d_t [/mm] <- y-x #Trendbereinigte Zeitreihe
f <- [mm] matrix(d_t, [/mm] 27, 4, byrow=T)
mittel <- mean(f, na.rm = TRUE)
[mm] s_t [/mm] <- apply(f,2, na.rm = TRUE,mean) #Schätzung der Saisonkomponenten
so das ist was ich bis jetzt habe, und y ist halt UKgas, das sind die Daten die sind halt vorprogrammiert bei R.
aber ich verstehe nicht wo mein fehler bei der dritten und vierten komponente ist.
entweder ist ja mein x falsch oder ich weiß es nicht..
wenn ich [mm] d_t [/mm] aufrufe kommen NAs wenn ich die entferne ist die Saisonkomponente noch abweichender als vorher.
dann hätte ich ja auch meine
[mm] y_t [/mm] <- [mm] y-s_t [/mm] #Berechnung der saisonbereinigte Zeitreihe
aber solange [mm] s_t [/mm] falsch ist, ist ja auch die saisonbereinigte Zeitreihe falsch
langsam bin ich wirklich am verzweifeln -.-
LG
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:02 Do 09.10.2014 | Autor: | Marcel |
Hallo,
nur nochmal der Hinweis (es ist übrigens gut, dass Du erwähnt hast, dass
es diese Daten in R gibt, denn jetzt habe ich das erstmal kurz getestet, und
sie auch gefunden):
Fehleranalysen in Algorithmen führt man am besten durch, indem man
Datensätze benutzt, die
so klein wie möglich und so groß wie nötig
sind. Wenn Du selbst überschauen kannst, was Du wann machst und was
Du erwartest (weil Du es schnell selbst gerechnet hast), dann siehst Du
auch evtl. die Stellen, wo etwas schief geht.
Wenn ich dazu komme, schaue ich mir Deinen Programm auch nochmal
selbst "von Hand" an. Dazu wäre es aber sinnvoll, wenn Du die
"code-Umgebung"
hier benutzt ([ code ] blabla [ /code ], ohne Leerzeichen).
Bzw. wie gesagt: reduziere die Daten aus UKgas auf einen überschaubaren
Datensatz (der die obigen Anforderungen erfüllt).
Gruß,
Marcel
|
|
|
|
|
1: | y <- UKgas
| 2: | p <- 4
| 3: | x <- if(!p%%2==1) {
| 4: | filter(y,rep(1/p,p))
| 5: | } else {
| 6: | filter= c(0.5, rep(1, p-1),0.5)/p} #Berechnung der geglätteten Zeitreihe
| 7: | d_t <- y-x #Trendbereinigte Zeitreihe
| 8: | f <- matrix(d_t, 27, 4, byrow=T)
| 9: | mittel <- mean(f, na.rm = TRUE)
| 10: | s_t <- apply(f,2, na.rm = TRUE,mean) #Schätzung der Saisonkomponenten
| 11: | y_t <- y-s_t #Berechnung der saisonbereinigte Zeitreihe |
PS: ich habe else zwar nun geändert aber das Problem ist immer noch dasselbe.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 13:46 Sa 11.10.2014 | Autor: | capri |
die Fälligkeit ist zwar abgelaufen, aber so würde es funktionieren
1: |
| 2: | y <- UKgas
| 3: |
| 4: | p <- 4
| 5: |
| 6: | filt <- if(p%%2) rep(1/p,p) else c(0.5, rep(1, p-1), 0.5)/p
| 7: | x <- filter(y, filt) #Berechnung der geglätteten Zeitreihe
| 8: |
| 9: | d_t <- matrix(y-x, , 4, byrow=TRUE)
| 10: | d_t.quer <- apply(d_t, 2, mean, na.rm=TRUE) #Schätzung der Saisonkomponenten
| 11: | s_t <- d_t.quer - mean(d_t.quer)
| 12: | y1 <- y - s_t # Saisonbereinigung
|
bei mir kommen deine gewünschten Werte raus.
LG
|
|
|
|
|
Hallo, tut mir leid, dass ich erst jetzt schreibe, ich war die ganze Zeit nicht online.
Habe es gerade ausprobiert und vielen dank hat geklappt :)
|
|
|
|