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,

die Inkonsistenz der jetzigen Excel-Datei mit den Daten, mit denen ich besher gearbeitet habe, besteht darin, dass ich bei den bisherigen Daten in abnormal_returns_buys_agg nur 5 Zeilen habe (bzw. in abnormal_returns_buys nur 7).
darrgans hat geschrieben: Mo Aug 06, 2018 8:39 pm 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
Ich bin weiterhin der Meinung, das macht der von mir vorgeschlagene Code so, wie es in den Formeln in der Excel-Datei implementiert ist:

Code: Alles auswählen

kumRend <- function(x) c(sum(x[1:20]), cumsum(x[-(1:21)])[c(1,5,10,20)])
t(apply(abnormal_returns_buys_agg[-(1:2)], 1, kumRend))
:!: Bitte lass Dich nicht von den Spaltennamen foppen (die stammen noch aus abnormal_returns_buys_agg)
Du kannst ja auch selber testen:

Code: Alles auswählen

kumRend(1:41)
c(sum(1:20), 22, sum(22:26), sum(22:31), sum(22:41))
BTW: Deine Spaltenbezeichnung X_0to1 hätte mich vermuten lassen, dass hier zwei Spalten summiert werden. :?
Die Datei mit den Formeln, falls ich diese aus der letzten gelöscht habe, findest du nochmal anbei.
Ich hatte vorher nicht nach den Formeln gesehen - da hatte ich wohl einen kurzen Blackout. Statt dessen war mir die oben beschriebene Inkonsistenz ins Auge gefallen.

Viele Grüße, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

ich bin gerade von der Arbeit gekommen und habe mir das nochmal angeschaut und auch die Funktion vertestet und verglichen.
Die Funktion läuft einwandfrei! Danke, das ist absolut top, jetzt muss ich das Ganze nur noch für die anderen Subsets replizieren und kann endlich testen.

Du warst echt eine gigantische Hilfe!!!
Vielen, vielen Dank.

Falls ich nochmal eine Frage habe, würde ich auf dich zukommen.
Viele Grüße,
Damian
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

ich habe noch eine Frage.
Ich würde gern die Residuen der linearen Regressionen auf Normalverteilung testen. Dafür gibt es ja verschiedene Test, wie den shapiro.test() und den ks.test().

Ich habe folgenden Code dazu geschrieben, aber irgendwie macht er nicht so wirklich was ich möchte.

Code: Alles auswählen

sapply(residuals(estimation_models_board_buys), shapiro.test)
Hast du eine Idee wieso das nicht geht?
Vielen Dank.
Viele Grüße,
Damian
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

ich bin es nochmal mit einem weiteren Anliegen. Ich muss eine zweite Auswertung machen, da meine Daten nicht normalverteilt sind. Der Ansatz baut darauf aus für den gesamten Zeitraum von -200 bis +20 abnormale Renditen zu bestimmen und diese dann mittels nicht-parametrischen Test zu testen.

Ich habe das bis hierher soweit ausgearbeitet:

(1) Als erstes eine zweite Funktion erstellt und den Zeitraum geändert:

Code: Alles auswählen

myworkaholic2 <- function(TDAY, Comp) {
  i.TDAY <- which(Daily_returns$Date==TDAY)
  M <- lm(as.formula(paste0(Comp, " ~ DAX")), data=Daily_returns[(i.TDAY-200):(i.TDAY+20),])
  P <- predict(M, newdata=Daily_returns[(i.TDAY-200):(i.TDAY+20), c("Date", "DAX")])
  a.TDAY <- which(Daily_returns$Date==TDAY)
  list(M=M, P=P, Dactco=unlist(Daily_returns[(a.TDAY-200):(a.TDAY+20), Comp], use.names = FALSE))
}
(2) Dann die Modelle in einem Element gespeichert und entsprechend benannt:

Code: Alles auswählen

model_predictions_buys_co <- mapply(FUN=myworkaholic2, myInside_buys$Trading_date, myInside_buys$Company_name, SIMPLIFY = FALSE)
model_names_buys <- paste(myInside_buys$Trading_date, myInside_buys$Company_name) ## naming the elements of the results of the mapply() 
names(model_predictions_buys_co) <- model_names_buys
(3) Dann die vorhergesagten Werte errechnet und entsprechend gespeichert:

Code: Alles auswählen

expected_returns_buys_co <- data.frame(myInside_buys[c("Company_name", "Trading_date")], t(sapply(model_predictions_buys_co, `[[`, "P")))
(4) Abnormal Renditen für den ganzen Zeitraum bestimmt:

Code: Alles auswählen

abnormal_returns_buys_co <- data.frame(myInside_buys[c("Company_name", "Trading_date")], t(sapply(model_predictions_buys_co, '[[', "Dactco")) - as.matrix(expected_returns_buys_co[3:224])) 
(5) Dann die Durchschnitte für gleiche Events berechnet:

Code: Alles auswählen

abnormal_returns_buys_agg_co <-  aggregate(as.matrix(abnormal_returns_buys[-(1:2)]) ~ Company_name + Trading_date, data=abnormal_returns_buys, FUN=mean)
Bis hierhin funktioniert der Code einwandfrei, allerdings ist es so dass von der Struktur des Dataframes die Modelle in der ersten Spalte stehen und die Tage als Variable über die Spalten verteilt sind. Ich würde gern Spalten und Zeilen des Dataframes transponieren, also tauschen.
Und dann im Anschluss einen Wilcoxn Test über die Spalten (in welchen dann die Events stehen) laufen lassen.

Allerdings kriege ich die Transposition nicht hin und habe auch nicht wirklich einen Ansatz wie ich den Test über die ganzen Events laufen lassen kann. Die Transposition der Spalten und Zeilen ist aber erstmal viel wichtiger.
Hast du eine Idee?

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: Do Aug 09, 2018 5:16 pm Ich würde gern die Residuen der linearen Regressionen auf Normalverteilung testen. Dafür gibt es ja verschiedene Test, wie den shapiro.test() und den ks.test().

Ich habe folgenden Code dazu geschrieben, aber irgendwie macht er nicht so wirklich was ich möchte.

Code: Alles auswählen

sapply(residuals(estimation_models_board_buys), shapiro.test)
Hast du eine Idee wieso das nicht geht?
ja, ich vermute, dass residuals(estimation_models_board_buys) nur einen Vektor liefert (und nicht - wie es für die Anwendung von sapply() passend wäre - eine Liste mit entsprechenden Vektoren). Ob meine Vermutung richtig ist, lässt sich überprüfen, wenn Du das Ergebnis von

Code: Alles auswählen

str(residuals(estimation_models_board_buys))
lieferst.
Wenn residuals(estimation_models_board_buys) nur einen Vektor liefert, dann sorgt sapply() dafür, dass die Elemente des Vektors einzeln der Reihe nach an die Funktion shapiro.test() übergeben werden - nur, dass die Funktion shapiro.test() mit einem einzlnen Element überhaupt nichts anfangen kann.

Gruß, 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 09, 2018 8:25 pm ich bin es nochmal mit einem weiteren Anliegen. Ich muss eine zweite Auswertung machen, da meine Daten nicht normalverteilt sind. Der Ansatz baut darauf aus für den gesamten Zeitraum von -200 bis +20 abnormale Renditen zu bestimmen und diese dann mittels nicht-parametrischen Test zu testen.

Ich habe das bis hierher soweit ausgearbeitet:

(1) Als erstes eine zweite Funktion erstellt und den Zeitraum geändert:

Code: Alles auswählen

myworkaholic2 <- function(TDAY, Comp) {
...
}
...
(2) Dann die Modelle in einem Element gespeichert und entsprechend benannt:
(3) Dann die vorhergesagten Werte errechnet und entsprechend gespeichert:
(4) Abnormal Renditen für den ganzen Zeitraum bestimmt:
(5) Dann die Durchschnitte für gleiche Events berechnet:

Code: Alles auswählen

abnormal_returns_buys_agg_co <-  aggregate(as.matrix(abnormal_returns_buys[-(1:2)]) ~ Company_name + Trading_date, data=abnormal_returns_buys, FUN=mean)
Du hast wieder etliche Objektnamen geändert; wenn Du bitte mal den Code ab der Zeile library(readxl) senden könntest, kann ich auch meinen Code entsprechend anpassen.
Bis hierhin funktioniert der Code einwandfrei, allerdings ist es so dass von der Struktur des Dataframes die Modelle in der ersten Spalte stehen und die Tage als Variable über die Spalten verteilt sind. Ich würde gern Spalten und Zeilen des Dataframes transponieren, also tauschen.
Und dann im Anschluss einen Wilcoxn Test über die Spalten (in welchen dann die Events stehen) laufen lassen.
Du meinst jetzt aber nicht etwa:

Code: Alles auswählen

apply(abnormal_returns_buys_agg_co[, -(1:2)], 1, wilcox.test)
:?: Oder etwa doch :?:
Allerdings kriege ich die Transposition nicht hin und habe auch nicht wirklich einen Ansatz wie ich den Test über die ganzen Events laufen lassen kann. Die Transposition der Spalten und Zeilen ist aber erstmal viel wichtiger.
Hast du eine Idee?
Hat sich das mit dem Transponieren damit erledigt? Es kann Gründe geben, Daten zu transponieren. Hier sehe ich keinen entsprechenden Grund.

Viele Grüße, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

danke fürs Feedback.
Zum ersten Problem:

Für

Code: Alles auswählen

str(residuals(estimation_models_buys))
kommt als Ergebnis in der Console "NULL". Also keine Liste.

Zum zweiten Problem:

Ich müsste den wilcoxn.test() dann über die Zeilen laufen lassen, das sich hier die Events befinden und ich mit dem Test schauen möchte, ob die 20 Renditen nach dem Event auch bei einem WIlcoxn Test() weit oben sind. Dafür muss ich aber die Events testen. Wenn ich ihn über die Spalten laufen lasse, dann würde ich ja jeden einzelnen Tag testen über die Events verteilen testen. Also z.B. für Spalte x1 (oder dritte Spalte, wenn man die ersten beiden nicht eliminiert) ja nur Ränge für Tag 1 über alle Events bestimmen und im Ergebnis ob der erste Tag über die Events hinweg auffällig ist. Damit kann ich aber nichts aussagen, ob das Event Einfluss auf die Ordnung der Renditen hat und diese nach dem Event signifikant höher sind.

Ich überlege gerade, ob ich nicht auch einen two paired wilcoxn test machen könnte, der im ersten Ansatz die CARs (vor dem Event -20 bis 0) mit den CARs nach dem Event vergleicht und schaut ob dort ein signifikanter Unterschied vorhanden. Das würde die ganze Prozedur deutlich verringern und das ganze Umschreiben wäre nicht nötig. Das muss ich aber noch mit meinem Prof besprechen.

Die Benennung ist soweit gleich geblieben, ich habe aber "_co" hinter die Elemente dieses Teil gesetzt. Das Element woraus die Daten stammen heißt weiterhin "myInside_buys" oder bei dir in der verkürzten Version "myInside".

VIelen Dank für Deine Hilfe an dieser Stelle.
Viele Grüße,
Darren
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von jogo »

Hallo Darren,
darrgans hat geschrieben: Fr Aug 10, 2018 12:55 pm Zum ersten Problem:

Für

Code: Alles auswählen

str(residuals(estimation_models_buys))
kommt als Ergebnis in der Console "NULL". Also keine Liste.
:shock:
Dann hast Du ein völlig anderes Problem.
Zum zweiten Problem:
...
Beachte bei apply() immer den Parameter MARGIN=, z.B. berechnet apply(x, 1, sum) Zeilensummen (die Elemente einer Zeile werden summiert) und apply(x, 2, sum) berechnet für jede Spalte eine Summe.
Ich sehe keinen Unterschied zwischen dem Berechnen der Zeilensummen einer Matrix im Vergleich zur Berechnung der Spaltensummen von deren Transponierter.

Code: Alles auswählen

x <- matrix(1:12, 3, 4)
apply(x, 1, sum)
apply(t(x), 2, sum)
Gruß, Jörg
darrgans

Re: Programmierhilfe - Lineares Regressionmodell

Beitrag von darrgans »

Hallo Jörg,

beim zweiten Problem stimme ich dir definitiv zu. Danke. :)

Wie kann ich das erste Problem lösen? Bzw. was ist das Problem? Ich würde das Modell schon ganz gern evaluieren.

Vielen Dank 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,

Du hast mir bisher noch nicht gezeigt, wie Du estimation_models_buys erzeugst.
... und Du kannst auch gleich das Ergebnis von

Code: Alles auswählen

str(estimation_models_buys)
mitliefern.

Viele Grüße, Jörg
Antworten