Fahrsimulatordatenauswertung

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

Moderatoren: EDi, jogo

Studentpsych
Beiträge: 13
Registriert: Di Apr 06, 2021 4:07 pm

Re: Fahrsimulatordatenauswertung

Beitrag von Studentpsych »

Hallo Bernhard,
Dank der R – Befehle, die du mir gezeigt hast, ist es mir nun gelungen ein Skript zu schreiben, welches die Daten aufbereitet und in eine neue Datei schreibt, alles im Prinzip wie geplant. Besten Dank dafür! Ich habe das Skript mal auf ein Minimum reduziert:

Code: Alles auswählen

setwd("C:/Users/RobinAOE/Desktop")
fasi <- read.table("P1.csv",
                   sep = ",", dec = ".", header = TRUE)
fasi$Traffic_T00_sRoad <- fasi$Traffic_T00_sRoad + 357
fasi$Traffic_T01_sRoad <- fasi$Traffic_T01_sRoad + 892
fasi$Traffic_T02_sRoad <- fasi$Traffic_T02_sRoad + 2565
fasi$Traffic_T03_sRoad <- fasi$Traffic_T03_sRoad + 2778
fasi$Traffic_T04_sRoad <- fasi$Traffic_T04_sRoad + 4640   

ampel_1 <- subset(fasi, Car_Road_sRoad > 697.5 & Car_Road_sRoad < 797.5) 
ampel_1$distance <- ampel_1$Traffic_T00_sRoad - ampel_1$Car_Road_sRoad
ampel_1$delta_v <- ampel_1$Car_v - ampel_1$Traffic_T00_LongVel 
ampel_1$ttc <- (ampel_1$distance - 5) / ampel_1$delta_v
ampel_1$delta_a <- ampel_1$Car_ax - ampel_1$Traffic_T00_a_0_x 

Eampel1ttc <- min(ampel_1$ttc)
Eampel1abstand <- min(ampel_1$distance)
Eampel1geschwindigkeit <- max(ampel_1$delta_v)  
Eampel1beschleunigung <- max(ampel_1$delta_a)

ampel_2 <- subset(fasi, Car_Road_sRoad > 1249.5 & Car_Road_sRoad < 1349.5)
ampel_2$distance <- ampel_2$Traffic_T01_sRoad - ampel_2$Car_Road_sRoad
ampel_2$delta_v <- ampel_2$Car_v - ampel_2$Traffic_T01_LongVel 
ampel_2$ttc <- (ampel_2$distance - 5) / ampel_2$delta_v
ampel_2$delta_a <- ampel_2$Car_ax - ampel_2$Traffic_T01_a_0_x 

Eampel2ttc <- min(ampel_2$ttc)
Eampel2abstand <- min(ampel_2$distance)
Eampel2geschwindigkeit <- max(ampel_2$delta_v)  
Eampel2beschleunigung <- max(ampel_2$delta_a)

ampel_3 <- subset(fasi, Car_Road_sRoad > 3067.5 & Car_Road_sRoad < 3167.5)
ampel_3$distance <- ampel_3$Traffic_T02_sRoad - ampel_3$Car_Road_sRoad
ampel_3$delta_v <- ampel_3$Car_v - ampel_3$Traffic_T02_LongVel 
ampel_3$ttc <- (ampel_3$distance - 5) / ampel_3$delta_v
ampel_3$delta_a <- ampel_3$Car_ax - ampel_3$Traffic_T02_a_0_x 

Eampel3ttc <- min(ampel_3$ttc)
Eampel3abstand <- min(ampel_3$distance)
Eampel3geschwindigkeit <- max(ampel_3$delta_v)  
Eampel3beschleunigung <- max(ampel_3$delta_a)

ampel_4 <- subset(fasi, Car_Road_sRoad > 4527.5 & Car_Road_sRoad < 4627.5)
ampel_4$distance <- ampel_4$Traffic_T03_sRoad - ampel_4$Car_Road_sRoad
ampel_4$delta_v <- ampel_4$Car_v - ampel_4$Traffic_T03_LongVel 
ampel_4$ttc <- (ampel_4$distance - 5) / ampel_4$delta_v
ampel_4$delta_a <- ampel_4$Car_ax - ampel_4$Traffic_T03_a_0_x 

Eampel4ttc <- min(ampel_4$ttc)
Eampel4abstand <- min(ampel_4$distance)
Eampel4geschwindigkeit <- max(ampel_4$delta_v)  
Eampel4beschleunigung <- max(ampel_4$delta_a)

ampel_5 <- subset(fasi, Car_Road_sRoad > 5067.5 & Car_Road_sRoad < 5167.5)
ampel_5$distance <- ampel_5$Traffic_T04_sRoad - ampel_5$Car_Road_sRoad
ampel_5$delta_v <- ampel_5$Car_v - ampel_5$Traffic_T04_LongVel 
ampel_5$ttc <- (ampel_5$distance - 5) / ampel_5$delta_v
ampel_5$delta_a <- ampel_5$Car_ax - ampel_5$Traffic_T04_a_0_x 

Eampel5ttc <- min(ampel_5$ttc)
Eampel5abstand <- min(ampel_5$distance)
Eampel5geschwindigkeit <- max(ampel_5$delta_v)  
Eampel5beschleunigung <- max(ampel_5$delta_a)

Endergebins <- matrix(c(Eampel1abstand, Eampel1geschwindigkeit, Eampel1beschleunigung, Eampel1ttc, Eampel2abstand, Eampel2geschwindigkeit, Eampel2beschleunigung, Eampel2ttc, Eampel3abstand, Eampel3geschwindigkeit, Eampel3beschleunigung, Eampel3ttc, Eampel4abstand, Eampel4geschwindigkeit, Eampel4beschleunigung, Eampel4ttc, Eampel5abstand, Eampel5geschwindigkeit, Eampel5beschleunigung, Eampel5ttc),ncol=1,byrow=TRUE)     
Endergebnistabelle <- as.table(Endergebins)

write.table(Endergebnistabelle, "P1_final.csv")
Aufgrund theoretischer Überlegungen habe ich einige Werte noch einmal angepasst, die Prinzipien bleiben ja zum Glück gleich. Außer bei der TTC und Geschwindigkeit, da hätte ich noch zwei dringende Fragen. Und zwar habe ich nicht berücksichtigt, dass die Minimalfunktion ja auch nach negativen Werten sucht und dass negative TTC-Werte in unserem Universum unnütze Informationen darstellen (Zeitangabe der Kollision, wenn die Zeit rückwärts laufen würde). Gibt es eine Möglichkeit diesen Befehl so zu modifizieren, dass nur das positive Minimum berücksichtigt wird, also alle Werte wie Null und größer Null? :

Code: Alles auswählen

Eampel1ttc <- min(ampel_1$ttc)
Dann eignet sich bei der Geschwindigkeitsdifferenz der Durchschnittswert wahrscheinlich besser als der Maximalwert. Kann ich das so machen (mean() anstelle von max())? :

Code: Alles auswählen

Eampel1geschwindigkeit <- mean(ampel_1$delta_v)
Das wäre dann tatsächlich alles, was ich zur Auswertung brauchen würde, vielen Dank nochmal – du hast mich da echt gerettet und ich konnte auch einiges lernen!
Ich habe auch echt Interesse für das Programm R entwickelt und denke, dass ich dieses vielleicht auch in Zukunft an der ein oder anderen Stelle nutzen werde. Diesbezüglich hätte ich auch noch ein paar Interessensfragen, wie man das ein oder andere vielleicht besser/übersichtlicher lösen kann (nur falls du noch Zeit und Lust hast diese zu beantworten, es wäre jetzt nicht dringend).
Jedes Mal, wenn ich diesen Code am Anfang ausführe (um den Variablen Konstanten hinzuzuaddieren) muss ich aufpassen, dass ich den Befehl nur einmal ausführe (ansonsten wird jedes Mal erneut addiert). Gibt es eine Möglichkeit diesen Befehl so zu modifizieren, dass er nur einmal ausgeführt werden kann? :

Code: Alles auswählen

fasi$Traffic_T00_sRoad <- fasi$Traffic_T00_sRoad + 357
Dann habe ich mir ein Tutorial angeschaut, wie man eine Tabelle erstellt und dieses Beispiel umgeschustert und auf meine Daten angewendet. Die Tabelle bildet so zwar in Reihenfolge die Ergebniswerte der Variablen ab, jedoch ohne Beschriftung. Gibt es eine Möglichkeit, dass diese Tabelle mit dem Ergebnis der Variablennamen beschriftet und vielleicht sogar nach Ampelnummer kategorisiert werden kann? :

Code: Alles auswählen

Endergebnis <- matrix(c(Eampel1abstand, Eampel1geschwindigkeit, Eampel1beschleunigung, Eampel1ttc, Eampel2abstand, Eampel2geschwindigkeit, Eampel2beschleunigung, Eampel2ttc, Eampel3abstand, Eampel3geschwindigkeit, Eampel3beschleunigung, Eampel3ttc, Eampel4abstand, Eampel4geschwindigkeit, Eampel4beschleunigung, Eampel4ttc, Eampel5abstand, Eampel5geschwindigkeit, Eampel5beschleunigung, Eampel5ttc),ncol=1,byrow=TRUE)     
Endergebnistabelle <- as.table(Endergebnis) 

Dann hatte mir dieser Plot, den du mir gezeigt hast, sehr gut gefallen:

Code: Alles auswählen

par(mfrow = c(4,1), mar = c(1.7,4,1,1)) 
plot(ampel_1$Car_Road_sRoad, ylab = "Position [m]", type = "l", ylim = c(200,900))
lines(ampel_1$Traffic_T00_sRoad, col = "red")
plot(ampel_1$distance, type="l", ylab = "distance")
plot(ampel_1$Car_v, ylab ="Velocity", type ="l")
lines(ampel_1$Traffic_T00_LongVel, col ="red")
plot(ampel_1$ttc, ylab = "Time to collision", type = "l")
Hier würde mich interessieren, ob es möglich ist so einen Plot über die kompletten Daten und alle 24 Versuchspersonen zu legen. Ich vermute ich müsste die Daten aller Versuchspersonen einlesen:

Code: Alles auswählen

daten <- read.csv("P1.csv", header = TRUE, sep = ",")
daten2 <- read.csv("P2.csv", header = TRUE, sep = ",")
...
daten24 <- read.csv("P24.csv", header = TRUE, sep = ",")
Diese Daten müssten dann irgendwie übereinander gelegt werden (zu einem einzelnen Datensatz), damit die oben genannten Plotbefehle auf einen einzelnen Datensatz angewendet werden können. Mitteln zu jedem Zeitpunkt würde hier nicht so einfach funktionieren, da die Daten der Versuchspersonen unterschiedlich groß sind (jede Versuchsperson ist unterschiedlich schnell gefahren). Hättest du da einen Vorschlag?
LG,
Robin
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fahrsimulatordatenauswertung

Beitrag von bigben »

Hallo Robin!
Studentpsych hat geschrieben: Mi Apr 28, 2021 9:24 pm... ist es mir nun gelungen ein Skript zu schreiben, welches die Daten aufbereitet und in eine neue Datei schreibt, alles im Prinzip wie geplant.
Das freut mich ehrlich.
..., dass die Minimalfunktion ja auch nach negativen Werten sucht und dass negative TTC-Werte in unserem Universum unnütze Informationen darstellen (Zeitangabe der Kollision, wenn die Zeit rückwärts laufen würde). Gibt es eine Möglichkeit diesen Befehl so zu modifizieren, dass nur das positive Minimum berücksichtigt wird, also alle Werte wie Null und größer Null?
Variante eins wäre, von jeder Geschwindigkeit den Betrag zu nehmen. Dann würden auch negative Geschwindigkeiten berücksichtigt, aber ihrem Betrage nach. Die Betragsfunktion heißt abs und funktioniert ganz einfach:

Code: Alles auswählen

abs(c(-3, -1, 0, 1, 3))
Um nur die positiven zu berücksichtigen gibt es bestimmt irgendwas in R, aber das kenne ich nicht. Ich würde mir eine eigene Funktion schreiben. Als Abkürzung von 'positive only' nenne ich die poson:

Code: Alles auswählen

poson <- function(x, other = NA) ifelse(x >= 0, yes = x, no = other)

werte <- -5:5
print(werte)
positivewerte <- poson(werte)
print(positivewerte)
In Wenn Du die oberste Code-Zeile an den Anfang von Deinem Skript setzt, kannst Du von da an die Funktion poson benutzen. Sie lässt positive Zahlen in Ruhe und gibt anstelle von negativen Werten NA zurück. Möchtest Du durch etwas anderes als durch NA ersetzen, für die Minimumbestimmung beispielsweise durch Inf, dann geht das so:

Code: Alles auswählen

positivewerte <- poson(werte, other = Inf)
print(positivewerte)
Dann eignet sich bei der Geschwindigkeitsdifferenz der Durchschnittswert wahrscheinlich besser als der Maximalwert. Kann ich das so machen (mean() anstelle von max())? :

Code: Alles auswählen

Eampel1geschwindigkeit <- mean(ampel_1$delta_v)
Das kannst Du so machen, aber Du musst bedenken, dass dann auch wieder positive und negative Relativgeschwindigkeiten auftreten.
Ich habe auch echt Interesse für das Programm R entwickelt und denke, dass ich dieses vielleicht auch in Zukunft an der ein oder anderen Stelle nutzen werde. Diesbezüglich hätte ich auch noch ein paar Interessensfragen, wie man das ein oder andere vielleicht besser/übersichtlicher lösen kann (nur falls du noch Zeit und Lust hast diese zu beantworten, es wäre jetzt nicht dringend).
Es ist unser Selbstverständnis als Forum, uns mit R-Fragen langfristig gegenseitig zu helfen. Wenn ich mal keine Zeit und keine Lust habe, was beides oft genug vorkommt, dann muss ich das Forum an dem Tag ja nicht aufmachen.
Wahrscheinlich ist es aber schlauer, für neue Probleme einen neuen Thread aufzumachen -- wenn dann andere einspringen finden sie viel leichter den Einstieg.
Jedes Mal, wenn ich diesen Code am Anfang ausführe (um den Variablen Konstanten hinzuzuaddieren) muss ich aufpassen, dass ich den Befehl nur einmal ausführe (ansonsten wird jedes Mal erneut addiert). Gibt es eine Möglichkeit diesen Befehl so zu modifizieren, dass er nur einmal ausgeführt werden kann? :

Code: Alles auswählen

fasi$Traffic_T00_sRoad <- fasi$Traffic_T00_sRoad + 357
Eine gute Angewohnheit, die nicht nur davor schützt, wäre es, jeweils eine neue Spalte anzulegen:

Code: Alles auswählen

fasi$Traffic_T00_sRoad_corrected <- fasi$Traffic_T00_sRoad + 357
Damit bist Du das Problem weitgehend los.
Dann habe ich mir ein Tutorial angeschaut, wie man eine Tabelle erstellt und dieses Beispiel umgeschustert und auf meine Daten angewendet. Die Tabelle bildet so zwar in Reihenfolge die Ergebniswerte der Variablen ab, jedoch ohne Beschriftung.
Ich verstehe gerade nicht, was Du damit erreichen willst und warum Du eine matrix erstellst, die Du dann in ein table-Format umwandelst. Ich weiß auch nicht, warum Du solche Daten in einem table-Format haben möchtest. Ich schlage vor, Du machst einen neuen Thread auf, postest ein kleines reproduzierbares Beispiel und erläuterst, wozu das ganze am Ende dienen soll. Dann findet sich bestimmt eine Lösung.

Hier würde mich interessieren, ob es möglich ist so einen Plot über die kompletten Daten und alle 24 Versuchspersonen zu legen.
Ich verstehe, dass Du mehr verschiedene Datenverläufe von mehreren Individuen, mehreren Ampelereignissen und mehreren Messwerten übereinander legen willst. Ich kann diesem Satz aber nicht entnehmen, wie das am Ende genau aussehen soll. Die Antwort lautet: Möglich ist das. Egal, wie Du das "das" ausgestaltest -- es ist ziemlich sicher möglich.

Auch da gilt: Neuen Thread aufmachen, Reproduzierbares Minimalbeispiel posten und Problem eindeutig beschreiben. Notfalls mit einer handgemalten Skizze.
Das ganze Gedöns mit dem plot und dem lines werden wir dann wahrscheinlich fallen lassen -- ich glaube manchmal, ich bin der letzte im Forum der das noch einigermaßen regelmäßig nutzt. Wenn das nicht der Datenkontrolle dient sondern publizierfähig werden soll, werden wir wahrscheinlich auf das Fremdpaket ggplot2 ausweichen. Ja, Standard-R macht die schöneren Grafiken als SPSS aber ggplot2 macht die schöneren Grafiken als Standard-R.

Ich vermute ich müsste die Daten aller Versuchspersonen einlesen:

Code: Alles auswählen

daten <- read.csv("P1.csv", header = TRUE, sep = ",")
daten2 <- read.csv("P2.csv", header = TRUE, sep = ",")
...
daten24 <- read.csv("P24.csv", header = TRUE, sep = ",")
Ja, wenn Du die Daten nutzen möchtest, musst Du sie einlesen. Dann wäre es gut, jedem dieser dataframes eine Spalte mit einer ID zuzuordnen, damit man nach dem zusammenführen erkennen kann, welche Daten Proband 5 und welche Proband 6 zuzuschreiben sind. Wenn die dataframes identisch benannte und inhaltlich gleichbedeutende Spalten haben, dann kann man sie mit rbind untereinander kleben.

So, auf mich wartet jetzt ein Patient, deshalb überlasse ich es Dir, Dir die Funktionsweise von rbind zu ergooglen. Es gibt bestimmt tausend tolle Blogs die das erklären.

Bis dann,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten