"Wenn, dann" - Befehle

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

Moderatoren: EDi, jogo

Antworten
Katharina.S

"Wenn, dann" - Befehle

Beitrag von Katharina.S »

Hallo zusammen, ich muss euch leider mit einer weiteren Frage belästigen :roll:

und zwar besteht mein Datensatz aus den Spalten Trade, User, Investment, Ergebnis des Trades.
Ich möchte nun das Investment-Verhalten der User analysieren, wenn sie einen Verlust im vorherigen Trade erfahren haben.

Dazu muss ich R ja sagen, dass er für jeden User schauen soll, ob
1.) das Ergebnis des Trades in t=0 negativ war und wenn ja,
2.) diesen Fall auswählen und im Weiteren schauen, ob
3.) das Investment desselben Users in t=1 dadurch durchschnittlich geringer ausfällt.

Hat irgendjemand evtl Lösungsansätze bzgl der Befehle für R?

Liebsten Dank im Voraus!
Katharina
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: "Wenn, dann" - Befehle

Beitrag von bigben »

Hallo Katharina,

ich empfehle für solche Fragen ein funktionierendes Minimalbeispiel zu posten. viewtopic.php?f=20&t=11
R soll jeden einzelnen Nuzer einzeln untersuchen. Dafür eignet sich tapply() als Befel gut. Je nach Situation auch aggregate() oder by(). Überprüfen, ob irgendwas kleiner Null ist, kann man mit if() und Mittelwerte vergleichen mit t.test().

HTH,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Katharina.S

Re: "Wenn, dann" - Befehle

Beitrag von Katharina.S »

Ein Beispiel für meinen Datensatz wäre:

Trade User Investment Ergebnis
1 4 3 +3
2 5 100 +5,6
3 5 70 -7
4 5 65 +2

Das heißt mich würde User 4 schonmal nicht interessieren (weil nur ein Trade vorhanden und ich so nichts über seine zukünftigen Investment-Entscheidungen weiß).
Aber dafür User 5 ab 3. Zeile, da dort sein Ergebnis negativ ist und ich gucken kann, ob er durchschnittlich weniger bei seinem nächsten Trade (Zeile 4) investiert.
Ich hoffe, das Beispiel macht es etwas deutlicher!
Benutzeravatar
student
Beiträge: 674
Registriert: Fr Okt 07, 2016 9:52 am

Re: "Wenn, dann" - Befehle

Beitrag von student »

Hallo Katharina,

wie Bigben schreibt, stellt R einige Funktionen zur Verfügung (ave-Beispiel), denke aber Du kommst um das Schreiben einer selbst geschriebenen Funktion nicht herum.
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: "Wenn, dann" - Befehle

Beitrag von bigben »

Hallo Katharina,

ja, das Beispiel macht es wesentlich deutlicher. Wie ich Deinem Beispiel entnehme, kann t = 0 irgendein Zeitpunkt sein, keineswegs der erste Trade jedes Users. Das Beispiel ist aber so kurz, dass vieles auch offen bleibt. Beispielsweise, ob die Trades nach Usern sortiert vorliegen, oder nicht. Ist für den Moment auch erst einmal egal.
Katharina.S hat geschrieben: So Dez 24, 2017 10:49 am Ein Beispiel für meinen Datensatz wäre:

Trade User Investment Ergebnis
1 4 3 +3
2 5 100 +5,6
3 5 70 -7
4 5 65 +2
Ein Beispiel für eine R gerechte Präsentation dieses Datensatzes ware

Code: Alles auswählen

handel <- read.table(text="Trade User Investment Ergebnis
                     1 4 3 +3
                     2 5 100 +5,6
                     3 5 70 -7
                     4 5 65 +2 ", header = TRUE, dec=",")
Copy&Paste, dann hat man die Daten in R und kann etwas damit tun.

Ich schlage Dir folgenden Einstieg vor:

Code: Alles auswählen

tapply(X = handel$Ergebnis, INDEX = handel$User, FUN = function(x) which(x < 0))
tapply wendet eine Funktion FUN auf jedes Handelsergebnis an und zwar getrennt nach Usern. Du erhälst für jeden User getrennt ein Ergebnis der Funktion FUN. In meinem Einstiegsbeispiel lautet FUN: which(x < 0). Also die Frage, der wievielte Trade eines jeden Nutzers mit einem negativen Ergebnis abgeschlossen wurde. Ergebnis:

Code: Alles auswählen

> tapply(X = handel$Ergebnis, INDEX = handel$User, FUN = function(x) which(x<0))
$`4`
integer(0)

$`5`
[1] 2
Für den User 4 wurde ein leerer Vector übergeben, weil 4 keine Verluste gemacht hat. Für den User 5 wird ein Vektor mit dem einzigen Wert 2 zurück geliefert, weil nur der zweite Trade von 5 mit einem Verlust abgeschlossen wurde.

Es käme im Folgenden also darauf an, eine Funktion FUN zu schreiben, die aus einem Ergebnisvektor für den User x die Informationen extrahiert, die Du zur Beantwortung Deiner Frage brauchst.

Du kannst ja die Tage mal nutzen und versuchen, folgenden Code zu verstehen. Der könnte eine ganz nützliche Richtung aufweisen:

Code: Alles auswählen

handel <- read.table(text="Trade User Investment Ergebnis
                     1 4 3 +3
                     2 5 100 +5,6
                     3 5 70 -7
                     4 5 65 +2 ", header = TRUE, dec=",")

mittel_nach_negativ <- function(x){
  negative <- which(x < 0) 
  nach_negative <- negative + 1
  mittel <- mean(x[nach_negative], na.rm = TRUE)
}

tapply(X = handel$Ergebnis, INDEX = handel$User, FUN = mittel_nach_negativ)
Frohe Feiertage,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Katharina.S

Re: "Wenn, dann" - Befehle

Beitrag von Katharina.S »

Vielen lieben Dank, Bernhard!

Das hat mir wirklich super geholfen schonmal!

Guten Rutsch,
Katharina
Katharina.S

Re: "Wenn, dann" - Befehle

Beitrag von Katharina.S »

Vielleicht könnt Ihr mir doch noch einmal weiterhelfen :)

und zwar interessiert mich ja eigentlich das durchschnittliche Investment der User nach einem negativen Ergebnis.
Demnach habe ich das X in Investment geändert. Nun ist ja das Problem, trotzdem die Fälle auszuwählen mit negativen Ergebnis bzw. die nachfolgenden.

ich habe den Befehl dann umgeändert in:

tapply(X = handel$investment, INDEX = handel$user, FUN = mittel_nach_negativ)

mittel_nach_negativ <- function(x){
negative <- which(handel$ergebnis < 0)
nach_negative <- negative + 1
mittel <- mean(x[nach_negative], na.rm = TRUE)
}


Aber leider führt R den Befehl nicht aus und gibt mir auch keine Fehlermeldung. Ich denke mal, es liegt an der Funktion, genauer gesagt (negative <- which(handel$ergebnis < 0)).
Habt Ihr eine Idee, wie ich den Fehler beheben kann? Liebsten Dank im Voraus!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: "Wenn, dann" - Befehle

Beitrag von bigben »

Hallo Katharina,

es lohnt sich i. d. R., Code in Code-Tags zu setzen. Das sieht dann mehr nach Programmierumgebung aus und man sieht z. B. schneller, dass User oben groß und in Deinem letzten Beispiel klein geschrieben wird. 'User' und 'user' sind für R zwei völlig verschiedene Namen. Wenn Du keine Fehlermeldung bekommen hast, benutzt Du jetzt wahrscheinlich einen anderen Datensatz, in dem die Spalten mit Kleinbuchstaben benannt sind. Bitte poste daher nochmal ein reproduzierbares Beispiel mit Daten und Code.

Weiters kommt es auf die Reihenfolge an. Du musst immer erst die Funktion definieren und kannst sie danach in tapply verwenden. Hier hast Du es jetzt anders herum geschrieben.

In der Funktion hast Du eine Verschlimmbesserung vorgenommen. Die von Dir selbst als kritisch erkannte Zeile

Code: Alles auswählen

negative <- which(handel$ergebnis < 0) 
bezieht sich jetzt wieder auf die ganze Spalte handel$ergebnis, nicht mehr auf jeden user getrennt.
LG,
Bernhard


Edit: Fehler in der ursprünglichen Formulierung gefunden und daher nach EDis Beitrag korriert,
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: "Wenn, dann" - Befehle

Beitrag von EDi »

Ich denke mal, es liegt an der Funktion, genauer gesagt (negative <- which(handel$ergebnis < 0)).
Richtig:

x ist innerhalb der Funktion ein Vektor (mit dem subset von handel$investment).
Du behandelts x aber, als wäre es ein data.frame mit der Spalte ergbenis [handel$ergebnis].
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Katharina.S

Re: "Wenn, dann" - Befehle

Beitrag von Katharina.S »

x ist innerhalb der Funktion ein Vektor (mit dem subset von handel$investment).
Du behandelts x aber, als wäre es ein data.frame mit der Spalte ergbenis [handel$ergebnis].
Hättet Ihr eine Idee, wie ich das Ergebnis (als Spalte oder Vektor) in Tapply integrieren kann, damit ich mich in der Funktion darauf berufen kann?
(X muss ja Investment bleiben, da ich ja das durchschnittliche Investment erfahren möchte)
Antworten