leonsuetfeld / moraldm

0 stars 0 forks source link

Zweiter Datensatz #2

Open leonsuetfeld opened 5 years ago

leonsuetfeld commented 5 years ago

Hey,

ich muss immer noch mit Gordon darüber reden, ob wir den zweiten Datensatz mit in das Paper nehmen, aber ich denke es kommt auch ein bisschen darauf an, wie interessant das ist was da raus kommt. Ich habe den Datensatz mit dem entsprechenden Analyse-File ins Repo gepackt.

Es ist sehr ähnlich zum ersten Datensatz, nur gibt es statt der Modality jetzt zwei verschiedene time-constraints (4.4s wie gehabt, 1.4s in der schnellen Bedingung), und alle Probanden sind alle Bedingungen durchlaufen. Dazu sind es wesentlich mehr human vs. human Daten, also deutlich kleinere Varianzen im Fit.

Was ich anhand dieses Datensatzes finden möchte, ist, ob folgende Eigenschaften auf Seite der Probanden einen Einfluss auf die Entscheidungen (also Parameter des Models) haben: 1) Alter 2) Geschlecht 3) Fahrerfahrung (wobei das stark mit Alter korreliert - eher weg lassen, falls das problematisch ist) 4) Videospiel-Erfahrung 5) SDS17 Score (Social Desirability Scale, misst wie sehr Probanden dazu neigen, sich in Fragebögen etc. besser darzustellen als sie eigentlich sind)

Fangen wir also einfach an.

Single Level Model

model_single = choice_left ~
  1 + visonset_left + visonset_left:abstraction + (sex_diff + young_diff + elderly_diff)*speed*abstraction

modelprior_single = get_prior(model_single, family=binomial, data=d1.hum.effect)

priors_single <- c(set_prior("normal(0,3)", class = "b"))

mres_single = brm(model_single,
                  family=bernoulli,
                  data=d1.hum.effect,
                  control = list(adapt_delta=0.9),
                  prior = priors_single)

läuft, keine Probleme.

Multi-level model wie beim ersten Datensatz

model_full = choice_left ~
  (1 + visonset_left + sex_diff + young_diff + elderly_diff)*speed*abstraction +
  ((1 + visonset_left + sex_diff + young_diff + elderly_diff)*speed*abstraction | sn_idx)

modelprior = get_prior(model_full, family=binomial, data=d1.hum.effect)

priors <- c(set_prior("lkj(2)", class = "cor"),
            set_prior("normal(0,3)", class = "b"),
            set_prior("cauchy(0,1)", class = "sd", group = "sn_idx")) # alternatives: exponential(1) / cauchy(0,1)

mres_full = brm(model_full,
                family=bernoulli,
                data=d1.hum.effect,
                control = list(adapt_delta=0.9),
                prior = priors)

läuft auch. Ähnliche Parameter wie beim anderen Datensatz auch:

Population-Level Effects: 
                                Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
Intercept                           0.05      0.12    -0.18     0.28       4000 1.00
visonset_left                       0.50      0.29    -0.07     1.06       2652 1.00
sex_diff                           -2.40      0.32    -3.08    -1.78       2322 1.00
young_diff                          7.41      0.82     5.91     9.17       1729 1.00
elderly_diff                       -6.03      0.65    -7.41    -4.84       1009 1.00
speed                               0.28      0.21    -0.13     0.71       4000 1.00
abstraction                         0.00      0.24    -0.49     0.48       4000 1.00
visonset_left:speed                -0.14      0.41    -0.95     0.65       4000 1.00
sex_diff:speed                      0.91      0.49    -0.05     1.86       4000 1.00
young_diff:speed                   -2.89      0.80    -4.53    -1.36       4000 1.00
elderly_diff:speed                  2.33      0.85     0.74     4.05       4000 1.00
visonset_left:abstraction          -0.50      0.42    -1.34     0.34       4000 1.00
sex_diff:abstraction                0.27      0.49    -0.70     1.22       4000 1.00
young_diff:abstraction              1.63      0.81     0.08     3.27       4000 1.00
elderly_diff:abstraction            4.20      0.78     2.74     5.87       4000 1.00
speed:abstraction                  -0.04      0.41    -0.83     0.77       4000 1.00
visonset_left:speed:abstraction    -0.00      0.78    -1.52     1.51       4000 1.00
sex_diff:speed:abstraction          0.42      0.91    -1.34     2.22       4000 1.00
young_diff:speed:abstraction        1.33      1.34    -1.27     3.98       4000 1.00
elderly_diff:speed:abstraction      0.17      1.33    -2.40     2.77       4000 1.00

Ein paar interessante Beobachtungen:

  1. keine nennenswerten Interaktionen zwischen speed und abstraction level - schon mal gut!
  2. speed: In der schnelleren Bedingung sind alle Obstacle-Parameter (sex, age) näher bei null. Erwartungsgemäß, dass die Entscheidungen unter Zeitdruck vermutlich mehr Noise drauf haben, dadurch kleinere Parameter-Werte.
  3. abstraction: Interessanterweise hier in der image condition eine größere Diskrepanz zwischen young und adult, aber eine wesentlich kleinere Diskrepanz zwischen adult und elderly. Das kann natürlich mit dem konkreten Aussehen der 3D-Figuren zu tun haben, widerspricht aber den Ergebnissen des ersten Datensatzes.

Sex als zusätzlichen Predictor Ich habe sex als -0.5 / +0.5 gecodet wie sonst auch die conditions, und wollte es aber nur als Hauptfaktor im Model haben, nicht alle Interactions auch noch mitnehmen (da ich denke, dass es sonst extrem viele Parameter werden, sobald wir das für alle fünf neuen Faktoren machen):

model_sex = choice_left ~
  (1 + visonset_left + sex_diff + young_diff + elderly_diff)*speed*abstraction + 
  (visonset_left + sex_diff + young_diff + elderly_diff)*sex + 
  ((1 + visonset_left + sex_diff + young_diff + elderly_diff)*speed*abstraction | sn_idx)
modelprior_sex = get_prior(model_sex, family=binomial, data=d1.hum.effect)
priors_sex <- c(set_prior("lkj(2)", class = "cor"),
                set_prior("normal(0,3)", class = "b"),
                set_prior("cauchy(0,1)", class = "sd", group = "sn_idx")) # alternatives: exponential(1) / cauchy(0,1)
mres_sex = brm(model_sex,
               family=bernoulli,
               data=d1.hum.effect,
               control = list(adapt_delta=0.9),
               prior = priors_sex)

Folgende results:

Population-Level Effects: 
                                Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
Intercept                           0.04      0.12    -0.19     0.29       2606 1.00
visonset_left                       0.52      0.31    -0.09     1.13       2092 1.00
sex_diff                           -2.44      0.34    -3.15    -1.81       1621 1.00
young_diff                          7.50      0.87     5.96     9.34       1249 1.00
elderly_diff                       -6.36      0.71    -7.84    -5.11       1020 1.00
speed                               0.29      0.21    -0.12     0.72       4000 1.00
abstraction                        -0.01      0.25    -0.52     0.45       4000 1.00
sex                                -0.00      0.24    -0.48     0.46       4000 1.00
visonset_left:speed                -0.17      0.43    -1.03     0.66       4000 1.00
sex_diff:speed                      0.92      0.50    -0.06     1.91       4000 1.00
young_diff:speed                   -2.92      0.81    -4.58    -1.37       4000 1.00
elderly_diff:speed                  2.31      0.82     0.72     3.96       2749 1.00
visonset_left:abstraction          -0.50      0.44    -1.34     0.35       4000 1.00
sex_diff:abstraction                0.30      0.50    -0.67     1.27       4000 1.00
young_diff:abstraction              1.63      0.79     0.11     3.24       4000 1.00
elderly_diff:abstraction            4.23      0.81     2.67     5.87       2423 1.00
speed:abstraction                  -0.05      0.42    -0.86     0.77       4000 1.00
visonset_left:sex                   0.20      0.59    -0.95     1.37       2269 1.00
sex_diff:sex                       -0.09      0.60    -1.30     1.06       2838 1.00
young_diff:sex                     -0.61      1.27    -3.22     1.79       2069 1.00
elderly_diff:sex                   -1.85      0.95    -3.79    -0.03       2624 1.00
visonset_left:speed:abstraction    -0.07      0.82    -1.74     1.46       4000 1.00
sex_diff:speed:abstraction          0.37      0.91    -1.46     2.16       4000 1.00
young_diff:speed:abstraction        1.41      1.40    -1.35     4.16       4000 1.00
elderly_diff:speed:abstraction      0.29      1.34    -2.34     2.95       4000 1.00

Ein Effekt ist hier zu sehen: Geschlecht "+0.5" (male) hat einen absolut größeren Effekt für elderly_diff, d.h. Männer neigen mehr als Frauen dazu, elderly people zu opfern.

Age, SDS-score und video game hours per week als zusätzliche Predictors Ich fitte jetzt mal das komplette model mit allen Zusatzfaktoren (sex, age, video games, SDS) als Haupteffekte ohne Interaktionen. Man muss ja nicht jede weitere Variable einzeln einführen:

# age sex sds vg model
model_agesexsdsvg = choice_left ~
  (1 + visonset_left + sex_diff + young_diff + elderly_diff)*speed*abstraction + 
  (visonset_left + sex_diff + young_diff + elderly_diff)*sex + 
  (visonset_left + sex_diff + young_diff + elderly_diff)*age_center + 
  (visonset_left + sex_diff + young_diff + elderly_diff)*sds17_center + 
  (visonset_left + sex_diff + young_diff + elderly_diff)*vg_center + 
  ((1 + visonset_left + sex_diff + young_diff + elderly_diff)*speed*abstraction | sn_idx)
modelprior_agesexsdsvg = get_prior(model_agesexsdsvg, family=binomial, data=d1.hum.effect)
priors_agesexsdsvg <- c(set_prior("lkj(2)", class = "cor"),
                        set_prior("normal(0,3)", class = "b"),
                        set_prior("cauchy(0,1)", class = "sd", group = "sn_idx"))
mres_agesexsdsvg = brm(model_agesexsdsvg,
                       family=bernoulli,
                       data=d1.hum.effect,
                       control = list(adapt_delta=0.9),
                       prior = priors_agesexsdsvg)

Results:

# Population-Level Effects: 
#                                 Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
# Intercept                           0.06      0.14    -0.21     0.32       4000 1.00
# visonset_left                       0.62      0.34    -0.06     1.27       2943 1.00 !!
# sex_diff                           -2.61      0.38    -3.39    -1.91       2401 1.00 !!!
# young_diff                          8.12      0.96     6.33    10.14       2022 1.00 !!!
# elderly_diff                       -6.86      0.77    -8.50    -5.46       1354 1.00 !!!
# speed                               0.32      0.23    -0.14     0.78       4000 1.00 !!
# abstraction                        -0.04      0.26    -0.55     0.48       4000 1.00
# sex                                -0.03      0.30    -0.64     0.58       4000 1.00
# age_center                          0.04      0.04    -0.03     0.13       4000 1.00
# sds17_center                        0.04      0.05    -0.04     0.14       4000 1.00
# vg_center                          -0.01      0.03    -0.07     0.05       4000 1.00
# visonset_left:speed                -0.21      0.46    -1.12     0.70       4000 1.00
# sex_diff:speed                      0.97      0.53    -0.07     2.04       4000 1.00 !!
# young_diff:speed                   -3.07      0.85    -4.80    -1.42       4000 1.00 !!!
# elderly_diff:speed                  2.51      0.90     0.78     4.29       4000 1.00 !!!
# visonset_left:abstraction          -0.59      0.48    -1.51     0.34       4000 1.00 !
# sex_diff:abstraction                0.34      0.52    -0.68     1.37       4000 1.00
# young_diff:abstraction              1.79      0.86     0.14     3.48       4000 1.00 !!!
# elderly_diff:abstraction            4.57      0.86     2.96     6.35       4000 1.00 !!!
# speed:abstraction                  -0.04      0.46    -0.96     0.87       4000 1.00
# visonset_left:sex                   0.51      0.74    -0.94     1.98       2856 1.00
# sex_diff:sex                        0.39      0.78    -1.16     1.93       4000 1.00
# young_diff:sex                     -0.47      1.60    -3.55     2.67       3171 1.00
# elderly_diff:sex                   -1.78      1.22    -4.14     0.62       3543 1.00 !!
# visonset_left:age_center           -0.02      0.09    -0.20     0.18       3295 1.00
# sex_diff:age_center                -0.13      0.10    -0.34     0.06       3225 1.00 !!
# young_diff:age_center              -0.12      0.22    -0.54     0.31       3127 1.00
# elderly_diff:age_center            -0.12      0.17    -0.46     0.20       4000 1.00
# visonset_left:sds17_center          0.18      0.12    -0.05     0.41       2925 1.00 !!
# sex_diff:sds17_center              -0.16      0.12    -0.40     0.07       3410 1.00 !!
# young_diff:sds17_center            -0.07      0.28    -0.62     0.50       2532 1.00
# elderly_diff:sds17_center          -0.10      0.20    -0.52     0.30       3328 1.00
# visonset_left:vg_center            -0.01      0.08    -0.17     0.14       2997 1.00
# sex_diff:vg_center                 -0.05      0.08    -0.21     0.11       4000 1.00
# young_diff:vg_center                0.02      0.18    -0.33     0.37       3024 1.00
# elderly_diff:vg_center              0.01      0.13    -0.25     0.26       4000 1.00
# visonset_left:speed:abstraction    -0.14      0.86    -1.90     1.57       4000 1.00
# sex_diff:speed:abstraction          0.31      0.97    -1.58     2.23       4000 1.00
# young_diff:speed:abstraction        1.71      1.44    -1.12     4.56       4000 1.00 !
# elderly_diff:speed:abstraction      0.27      1.44    -2.53     3.08       4000 1.00

# Effects:
# "!" marks those where the MAP value is more than one SD away from 0
# "!!" marks those where a "large" part of the probability mass is on one side of 0
# "!!!" marks those where the 95% CI is on one side of 0.

Meine Interpretation: Age:

behinger commented 5 years ago

Ist es vllt. problematisch, dass es eine 1:1 Korrespondenz zwischen sex und sn_idx gibt?

Genau das ist das Problem. "Sex" ist ein between subject faktor. Du kannst ja keine Random-Slope berechnen, dafür müsstest du "sex"=male und "sex"=female in der gleichen VP gemessen haben. Dementsprechend würde man "sex" und alle interaktionen davon aus der zweiten Klammer rauslassen.

  (1 + visonset_left + sex_diff + young_diff + elderly_diff)*speed*abstraction + 
  (visonset_left + sex_diff + young_diff + elderly_diff)*sex + 
  ((1 + visonset_left + sex_diff + young_diff + elderly_diff)*speed*abstraction | sn_idx)
behinger commented 5 years ago

Der effekt von alter wird sehr sehr schwierig in das Model reinzubringen sein. da wir keine Ahnung haben, welche "Form" der Effekt haben sollte, kann man es natürlich mit einem linearen Effekt versuchen, der wird aber sicherlich nicht die wahre Form beschreiben. Quadratische Effekte, cubische, logarithmische,alles denkbar. 85 Datenpunkte werden da denke ich nicht ausreichen.

Ich würde das Datenset reinnehmen, es ist sehr nahe dran, man kann einfach plots kombinieren (und etwaige unterschiede diskutieren).

Beim plotten ist mir aufgefallen, dass die fixed-effects viel stärkere Effekte implien als die plots.

z.B. hier:

grafik

Es würde sicherlich viel Sinn machen, beide Datensets in den gleichen Figures zu packen, so dass man eine bessere intuition bekommt was gleich/unterschiedlich ist.

Die großen Effektgrößen machen mich immernoch sehr stutzig. Und damit sehr schwer zu interpretieren

leonsuetfeld commented 5 years ago

Age Ich sehe zwei Möglichkeiten: (1) Da wir keine Ahnung haben, was für eine Form so ein Effekt haben würde, erst mal das einfachste annehmen (also linear) und schauen ob es nen Effekt gibt. Das Ergebnis reporten und einschränken, dass wir nur nach linearen Effekten geschaut haben, und eben keine verlässliche Aussage über etwaige non-lineare Effekte treffen können. (2) Alle VPs auf zwei Eimer aufteilen, einen für die jüngere Hälfte und einen für die Ältere. Das ist unpräzise, würde starke Effekte aber wahrscheinlich dennoch aufzeigen. Wir müssten wenn wir nichts finden natürlich diskutieren, dass wir insgesamt nur eine kleine Age-Range hatten und was auch immer rauskommt nur als Hinweis zu verstehen ist. (Das wäre dann wieder ne -0.5/0.5 codierung für das Alter).

Fixed Effects Fixed-Effects sind die Population-Level Effects? Sorry, ich bin mit dem Vokabular nicht so vertraut :) Ich bin auch noch nicht ganz sicher was ich in dem Plot erkennen soll, den du gepostet hast. Können wir vllt. noch mal Skypen heute? Wenn nicht müssten wir vermutlich doch hier in den Issues Kommunizieren, da morgen und Samstag bei mir ziemlich voll sind.

Effektgrößen Mögliche Erklärung im anderen Issue.

behinger commented 5 years ago

Age Linear können wir machen. Aufteilen in zwei Eimer würde ich nicht machen. Eher würde ich einen nichtlinearen spline effekt fitten. Das geht sehr einfach: e.g. choice~1+t2(age)*sex_diff

Fixed Effects Ja, das sind die means der populations level. Was ich bei dem Plot meinte, obwohl die fixed effects irgendwas bei -6 sind, (d.h. exp(-6) => odds=0.0024 => prob ~0.0024%*) sind die means der effekte eher bei ~80%. Das verwundert mich noch etwas

leonsuetfeld commented 5 years ago

Fixed Effects Ich glaube was du hier ansprichst ist das, was ich im anderen Issue diskutiere, dass die Population-Effects so groß werden im Multilevel-Model.

und meinst du nicht odds = 0.0024 => prob ~0.24% ?

Age Ich glaube ich würde es lieber bei linearen Effekten belassen, um die Leser nicht völlig zu überfordern. Ich denke zwar, ich verstehe wie so ein spline fit aussehen könnte, aber wenn der groß von linear abweicht, dann wäre es so oder so schwierig zu interpretieren, oder? Gerade bei der kleinen Range an Age in unserem Datensatz.

Edit: Ich halte den ersten Post jetzt aktuell, damit der als Referenz dient.

behinger commented 5 years ago

FIxed Effects ja, sorry 0.24% :)

Age Interpretation ist ok schwierig, im logistischen kontext natürlich noch viel mehr. Man kann sich aber die marginal effects plotten und anschauen. Besser als categorisieren. WIr könnens einfach mal fitten und schauen ob eine komplexe shape rauskommt oder nicht

leonsuetfeld commented 5 years ago

Schau mal oben in meine Interpretation des "vollen" Models (ist auch noch ne Frage mit drin). Das würde ich gerne als einziges reporten für den zweiten Datensatz. Man hat da meiner Meinung nach eine schöne Übersicht darüber was die results wie beeinflusst, und mehr brauchts meiner Meinung nach auch nicht.

leonsuetfeld commented 5 years ago

Coding der Conditions Frage: Es gibt ja ziemlich eindeutige Effekte von speed. Da die Probanden in der schnellen Condition ziemlich hohen Zeitdruck hatten, ist hier davon auszugehen, dass relativ viele Fehler passiert sind (also Noise auf den Daten ist), und dadurch die Parameter schwächer ausfallen. Für die Interpretation und Argumentation sehe ich es als sinnvoller an, speed 0/1 zu coden, so dass die Haupteffekte der langsamen Bedingung entsprechen, und die ":speed" parameter dann dazu addiert werden, um die Werte für die schnelle Bedingung zu erhalten.

Gleichzeitig kann man dann auch bei der Abstraction drüber Nachdenken, ob man auch da eine Haupt- und eine beeinträchtigte Condition sieht. Da würde ich aber eher sagen nein, denn es ist nicht von vornherein klar, in welche Richtung das ganze ausfallen würde, und ob eines davon eine Beeinträchtigung darstellt.

Hältst du es für ok, die eine condition im 0/1 coding, und die andere im -0.5/+0.5 coding rein zu nehmen?

behinger commented 5 years ago

Ja das passt und klingt vernünftig. Ich finde es dann wichtig in der Ergebnis-Figure/Tabelle ganz unten ganz klein hinzuschreiben wie die Faktoren codiert waren. Das habe ich schon in andern Papern gesehen und fand ich da top :)

leonsuetfeld commented 5 years ago
study2_main_results

Den Code habe ich hochgeladen, muss die Labels an den Histogrammen aber noch ändern. Mache ich evtl. noch im Laufe des Abends.

leonsuetfeld commented 5 years ago
study2_main_results

etwas überarbeitet für bessere lesbarkeit

behinger commented 5 years ago

So Github ging bei mir nicht. Kurzer Kommentar dazu, ich würde immer diesselben skalen verwenden, aber das kann ich gleich noch fixen versuchen :-)

leonsuetfeld commented 5 years ago

ja, ich hatte damit ein bisschen rumgespielt, aber das beste ist wohl einfach die xticks zu ändern. muss nur noch schauen wie.