Programmierhilfe - Lineares Regressionmodell

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,
darrgans hat geschrieben: Do Aug 02, 2018 5:43 pm Entschuldige die fehlerhafte Beschreibung bei der Subtraktion am Anfang, ich bin schlichtweg nach den Stunden vorm Rechner schon halbgar gekocht.
kein Problem - war ja schnell aufgeklärt.
Zum letzten Teil:
Mit der str() Funktion zeigt er mir folgendes an:

Code: Alles auswählen

 num [1:774, 1:41] -0.00091 -0.000307 -0.000307 -0.005356 -0.005356 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:774] "2017-11-28 Adidas" "2017-11-10 Adidas" "2017-11-10 Adidas" "2017-10-11 Adidas" ...
  ..$ : NULL
Das zeigt, dass das Objekt eine numerische Matrix mit der Form [1:774, 1:41] ist - also 774 Zeilen und 41 Spalten.
wenn ich mir das mit view() anschauen will, dann zeigt er mit nur 21 Spalten an.
View() bedient die grafische Oberfläche: das ist nicht oRiginär. Eigentlich sollte es dann in der Ansicht irgendwo Scrollbalken mit Slidern geben, aber ich habe auch schon von Anzeigefehlern von View() gelesen. Besser man greift im Zweifelsfall auf entsprechende Funktionen zurück, die direkt zu R gehören.
Ist es möglich, dass das Ergebnis in ein Dataframe umgewandelt wird, so wie es hier:

Code: Alles auswählen

data.frame(myInside_buys[c("Company_name", "Trading_date")], t(sapply(model_predictions_buys, `[[`, "P")))
auch gemacht wurde?
ja, das kann man bei Bedarf machen.
Ich habe versucht das ganze direkt zu verknüpfen in dieser Art:

Code: Alles auswählen

Abnormale_renditen <- data.frame(myInside_buys[c("Company_name", "Trading_date")], t(sapply(model_predictions_buys, '[[', "Dact")) - as.matrix(expected_returns_buys[3:43]))
Das geht auch wohl durch, allerdings bin ich mir unsicher ob das code-technisch korrekt ist. Kannst du einen Blick darauf werfen?
Das ist nicht verkehrt. Die üblichen Umwandlungsfunktionen haben Namen der Form as.~, z.B. as.data.frame().
Ich selbst halte es so:
ob und in was umgewandelt wird, mache ich abhängig von den weiteren Verarbeitungsschritten. Zum Beispiel hätte man auch erst

Code: Alles auswählen

sapply(model_predictions_buys, '[[', "Dact") - sapply(model_predictions_buys, `[[`, "P") ### oder ggf.
t(sapply(model_predictions_buys, '[[', "Dact") - sapply(model_predictions_buys, `[[`, "P"))
rechnen können, und um die Namen kümmert man sich erst, wenn es sein muss.

Viele Grüße, Jörg
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,
darrgans hat geschrieben: Do Aug 02, 2018 6:50 pm
ich habe inzwischen weitergemacht und mich dem Punkt der Aggregation zu Mittelwerten für gleiche Trading_dates und Companyeinträge gewidmet. Dies sieht wie folgt aus:

Code: Alles auswählen

abnormal_returns_buys_agg <- aggregate(list(abnormal_returns_buys$X1, abnormal_returns_buys$X2, abnormal_returns_buys$X3, abnormal_returns_buys$X4,abnormal_returns_buys$X5, abnormal_returns_buys$X6, abnormal_returns_buys$X7, abnormal_returns_buys$X8,abnormal_returns_buys$X9, abnormal_returns_buys$X10, 
                                            abnormal_returns_buys$X11, abnormal_returns_buys$X12,abnormal_returns_buys$X13, abnormal_returns_buys$X14, abnormal_returns_buys$X15, abnormal_returns_buys$X16,abnormal_returns_buys$X17, abnormal_returns_buys$X18, abnormal_returns_buys$X19, abnormal_returns_buys$X20,
                                            abnormal_returns_buys$X21, abnormal_returns_buys$X22, abnormal_returns_buys$X23, abnormal_returns_buys$X24,abnormal_returns_buys$X25, abnormal_returns_buys$X26, abnormal_returns_buys$X27, abnormal_returns_buys$X28, abnormal_returns_buys$X29, abnormal_returns_buys$X30,
                                            abnormal_returns_buys$X31, abnormal_returns_buys$X32,abnormal_returns_buys$X33, abnormal_returns_buys$X34, abnormal_returns_buys$X35, abnormal_returns_buys$X36, abnormal_returns_buys$X37, abnormal_returns_buys$X38, abnormal_returns_buys$X39, abnormal_returns_buys$X40,
                                            abnormal_returns_buys$X41), by = list(abnormal_returns_buys$Company_name, abnormal_returns_buys$Trading_date), mean)
Die Benennung ist auf englisch, aber sonst ist es das Dataframe "Abnormale_renditen" auf das ich dich gebeten hatte einen Blick zu werden. :)
Die Aggragation zu Mittelwertel hat geklappt,
da warst Du aber fleißig. Bei mir sieht das so aus:

Code: Alles auswählen

abnormal_returns_buys_agg <-  aggregate(as.matrix(abnormal_returns_buys[-(1:2)]) ~ Company_name + Trading_date, data=abnormal_returns_buys, FUN=mean)
Hier zeigt sich auch (an der erneuten Umwandlung in eine Matrix), dass es nicht unbedingt gut war, abnormal_returns_buys sofort als Dataframe zu erstellen.
allerdings disaggregiert R das Ganze wieder, wenn ich es in ein Dataframe umwandeln möchte. (Wollte ich nur aus ästhetischen und Übersichtlichkeitsgründen machen).
Hier verstehe ich nicht, was Du mit disaggregieren meinst, denn das Ergebnis von aggregate ist ein Dataframe:

Code: Alles auswählen

str(aggregate(as.matrix(abnormal_returns_buys[-(1:2)]) ~ Company_name + Trading_date, data=abnormal_returns_buys, FUN=mean))
Viel wichtiger ist, wenn ich jetzt eine einzelne Spalten kummulieren möchte, z.B. Spalten 3-22 und hierfür die cumsum() Funktion nützen möchte, dann gibt er mir in dem neuen Element nur die gleichen 20 Spalten wieder aus anstatt diese zu einer Spalte zu aggregieren.

Code: Alles auswählen

P-20to0 <- cumsum(abnormal_returns_buys_agg[, 3:22])

Hast du eine Idee woran das liegen kann? Die cumsum() Funktion besteht nicht wirklich aus vielen Argumenten.
Zunächst: nicht jede Zeichenkette ist ein valider Bezeichner für ein Objekt: P-20to0 ist es nicht:

Code: Alles auswählen

> P-20to0 <- "hallo"
Fehler: unerwartetes Symbol in "P-20to0"
Möchtest Du cumsum() spaltenweise anwenden? Dann vielleicht so:

Code: Alles auswählen

sapply(abnormal_returns_buys_agg[-(1:2)], cumsum) ## oder so:
apply(abnormal_returns_buys_agg[-(1:2)], 2, cumsum)
Viele Grüße, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

sorry für die lange Responsezeit, allerdings war ich heute arbeiten und habe es nicht früher geschafft.
Erstmal vielen Dank für die Vereinfachung bei der aggregate() Funktion, das spart mir viel tippen. :D

Ich habe die Funktionen

Code: Alles auswählen

sapply(abnormal_returns_buys_agg[-(1:2)], cumsum) ## oder so:
apply(abnormal_returns_buys_agg[-(1:2)], 2, cumsum)
ausprobiert und mir danach das Element angeschaut. Ich habe auch gestern schon vorab nochmal etwas über die cumsum() Funktion gesucht und ich weiß gar nicht, ob die so geeignet ist.

Ich möchte eigentlich ein neues Element "Kumulierte_renditen" generieren, dass 7 Spalten enthält. Spalte 1 & 2 wären Company und Trading_date. Die nächsten Spalten sollten folgende Werte aus dem Element "abnormal_returns_buys_agg" enthalten:
  • 3: Die kummulierten Werte für die Spalten 3 bis 22 von "abnormal_returns_buys_agg"
    4: Die Werte von Spalte 24
    5: Die kummlierten Werte von Spalte 24 bis 28
    6: Die kummlierten Werte von Spalten 24 bis 33
    7: Die kummlierten Werte von Spalte 24 bis 43
Ich habe überlegt erst einzelne Elemente zu generieren, welche die jeweiligen Spalten 3 bis 7 enthalten und diese dann mit cbind() zu verbinden, aber das wollte mir nicht so recht gelingen.
Hast du da einen Ansatz?

Vielen Dank an dieser Stelle nochmal.
Viele Grüße,
Damian
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,
darrgans hat geschrieben: Fr Aug 03, 2018 10:51 pm Ich habe die Funktionen

Code: Alles auswählen

sapply(abnormal_returns_buys_agg[-(1:2)], cumsum) ## oder so:
apply(abnormal_returns_buys_agg[-(1:2)], 2, cumsum)
ausprobiert und mir danach das Element angeschaut. Ich habe auch gestern schon vorab nochmal etwas über die cumsum() Funktion gesucht und ich weiß gar nicht, ob die so geeignet ist.

Ich möchte eigentlich ein neues Element "Kumulierte_renditen" generieren, dass 7 Spalten enthält. Spalte 1 & 2 wären Company und Trading_date. Die nächsten Spalten sollten folgende Werte aus dem Element "abnormal_returns_buys_agg" enthalten:
  • 3: Die kummulierten Werte für die Spalten 3 bis 22 von "abnormal_returns_buys_agg"
    4: Die Werte von Spalte 24
    5: Die kummlierten Werte von Spalte 24 bis 28
    6: Die kummlierten Werte von Spalten 24 bis 33
    7: Die kummlierten Werte von Spalte 24 bis 43
Ich habe überlegt erst einzelne Elemente zu generieren, welche die jeweiligen Spalten 3 bis 7 enthalten und diese dann mit cbind() zu verbinden, aber das wollte mir nicht so recht gelingen.
Hast du da einen Ansatz?
kumulierte Elemente bedeutet doch einfach Summe, oder nicht?

Code: Alles auswählen

kumRend <- function(x) c(sum(x[1:20]), cumsum(x[-(1:21)])[c(1,5,10,20)])
apply(abnormal_returns_buys_agg[-(1:2)], 1, kumRend)
Bitte kontrolliere, ob es die richtigen Spalten sind, auf die zugegriffen wird.
(wegen abnormal_returns_buys_agg[-(1:2)] kommt es zu einer Verschiebung: 1 statt 3, 2 statt 4 usw.; das Entfernen der ersten beiden Spalten ist aber notwendig, damit apply() den Rest in eine numerische Matrix umwandeln kann.)

Viele Grüße, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

vielen Dank nochmal. Ich habe den Code ausprobiert, allerdings stimmt da etwas nicht.
Das Ergebnis sieht wie folgt aus:

1 Wert
x22 Wert
x26 Wert
x31 Wert
x41 Wert


Allerdings hat das Kummulieren nicht geklappt, wie es sollte. Es war beabsichtigt, dass eine Spalten "aufsummiert" werden. Ein Beispiel für die 5 Tage, die in Spalte 5 aus meiner Nachricht von gestern Abend beschrieben sind, wäre:

x1 x2 x3 x4 x5
1 3 5 7 9
2 4 6 8 10
3 5 7 9 11

Das sollte dann zu folgenden aufsummiert werden:

5_days_after_trading
25
30
35

und das gleiche dann halt für einen Tag (wobei hier eigentlich nur die entsprechende Spalte übernommen werden muss), 10 Tage und 20 Tage. Es wäre natürlich unendlich geil, wenn die ersten beiden Spalten aus "abnormal_returns_buys_agg" erhalten bleiben, weil dies die Übersichtlichkeit der Daten exponentielle steigert. Kann man die Spalten nachdem man kumuliert hat wieder entsprechend davor setzen?

Vielen Dank nochmal für Deine Geduld.
Viele Grüße,
Damian
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

ich habe das Ganze mal nach Excel exportiert und dort aufbereitet, damit du eine bessere Vorstellung bekommst wie das aussehen sollte. Ich kann natürlich jetzt die Excel wieder einspielen und meine Tests darauf aufbauend machen, allerdings wäre das irgendwie total unelegant. :D Und für die Prüfer nicht nachvollziehbar, da ich sonst die ganzen Excels, die ich zwischenzeitlich erzeuge mit abgeben müsste.

Vielen Dank nochmal, dass Du dich meiner annimmst.
Viele Grüße,
Damian
Dateianhänge
test.xlsx
(292.82 KiB) 49-mal heruntergeladen
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,

kannst Du bitte eine entsprechende Datei erzeugen für die Daten, die Du mir zur Verfügung gestellt hast?

Gruß, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,
das ist kein Problem.

Dann sind alle Kauftransaktionen, daher wäre es diese Datei anbei.
Ich habe in der Zwischenzeit auch etwas weiterprobiert und bin auf das Packet "dplyer" gestoßen. Ich glaube die summarise() aus dem Paket könnte etwas sein.

Code: Alles auswählen

x <- summarise(abnormal_returns_buys_agg, TwentytoZero = sum(abnormal_returns_buys_agg[, (3:22)]))
Allerdings funktioniert das immer noch nicht wie erwartet.

Besten Dank für Deine Hilfe an dieser Stelle nochmals.
Viele Grüße,
Damian
Dateianhänge
All_buys.xlsx
All_buys
(56.14 KiB) 48-mal heruntergeladen
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Damian,
darrgans hat geschrieben: Mo Aug 06, 2018 4:50 pm Hallo Jörg,
das ist kein Problem.

Dann sind alle Kauftransaktionen, daher wäre es diese Datei anbei.
Da sehe ich aber nichts von
X_20to0 X_0to1 X_0to5 X_0to10 X_0to20
Ich hatte gehofft, dass ich damit ergründen kann, wie Du diese Berechnung anstellst.
Ich habe in der Zwischenzeit auch etwas weiterprobiert und bin auf das Packet "dplyer" gestoßen. Ich glaube die summarise() aus dem Paket könnte etwas sein.

Code: Alles auswählen

x <- summarise(abnormal_returns_buys_agg, TwentytoZero = sum(abnormal_returns_buys_agg[, (3:22)]))
Allerdings funktioniert das immer noch nicht wie erwartet.
ich bin von der data.table-Fraktion.
Aber egal, was man einsetzt, muss zunächst der Algorithmus klar sein, deshalb bin ich als erstes ein großer Fan von Lösungen in R ohne jegliche Zusatzpakete.

Viele Grüße, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

die Berechnungen, wie ich auf die Werte "X_20to0, X_0to1, X_0to5, X_0to10, X_0to20" berechne sind noch als Formeln im zweiten Sheet der "Test"-Excel noch in den Zellen enthalten.
Das sind die Summen von:

X20to0: 20 Tage vor dem Event bis zum Event aufsummiert
X_0to1: 1 Tag nach dem Event
X_0to5: 5 Tage nach dem Event aufsummiert
X_0to10: 10 Tage nach dem Event aufsummiert
X_0to20: 20 Tage nach dem Event aufsummiert

Die abnormal Renditen, die aufsummiert werden befinden sich im Element "abnormal_returns_buys_agg" und wurden entsprechend des Codes mit der Funktion Workaholic bestimmt. Also erstmal die Vorhersagemodelle gebaut, dann die Vorhersagen für 20 Tage vor und nach dem Event mit den Modellen bestimmt (diese sind dann die erwarteten Renditen), danach dann von den tatsächlichen Renditen (welche im Element Dact sind) die erwarteten Renditen abgezogen. So ist das Element "abnormal_returns_buys" entstanden. Dieses wurde dann ja - wegen der Doppelungen für manche Companies an einigen Trading dates zu einem Mittelwert verdichtet, dadurch ist dann das Element "abnormal_returns_buys_agg" entstanden, welches ich in Excel exportiert habe. Dort habe ich dann die obigen Summierungen für den jeweiligen Zeitraum vorgenommen.

Die Datei mit den Formeln, falls ich diese aus der letzten gelöscht habe, findest du nochmal anbei.
Vielen Dank!!
Viele Grüße,
Damian
Dateianhänge
test.xlsx
(292.8 KiB) 47-mal heruntergeladen
Antworten