Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zweiter Datensatz #2

Open
leonsuetfeld opened this issue Sep 5, 2018 · 13 comments
Open

Zweiter Datensatz #2

leonsuetfeld opened this issue Sep 5, 2018 · 13 comments

Comments

@leonsuetfeld
Copy link
Owner

leonsuetfeld commented Sep 5, 2018

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:

  • die age_center Werte sind zu verstehen als Effekt pro zusätzlichem Lebensjahr
  • sex_diff ist demnach bei älteren Leuten stärker ausgeprägt als bei jüngeren
    Social Desirability:
  • Effekte sind pro Score-Punkt auf der SDS-Skala
  • Mehr social desirability Antwortneigung führt zu stärkerem omission bias (auf der visonset Spur bleiben)
  • Mehr social desirability Antwortneigung führt zu stärkerem sex_diff Effekt, es werden dann also die Frauen noch mehr bevorzugt / geschützt.
  • evtl. macht es Sinn, diese doch nicht zu centern, sondern bei 0 starten zu lassen, damit die anderen paramter nicht angeben, was bei mittlerer "social desirability-Beeinflussung" los ist, sondern, wie es ohne Social Desirability ist. Dass wir also den Effekt davon "rausrechnen". Stimmst du zu?
    Sonstige:
  • alles andere sind die main effects bzw. Effekte der Experimentellen Bedingung (speed / abstraction)
@behinger
Copy link
Collaborator

behinger commented Sep 6, 2018

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
Copy link
Collaborator

behinger commented Sep 6, 2018

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
Copy link
Owner Author

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
Copy link
Collaborator

behinger commented Sep 6, 2018

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

  • die equivalenz von odds und probabilities sind nur selten so übereinstimmend

@leonsuetfeld
Copy link
Owner Author

leonsuetfeld commented Sep 6, 2018

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
Copy link
Collaborator

behinger commented Sep 6, 2018

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
Copy link
Owner Author

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
Copy link
Owner Author

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
Copy link
Collaborator

behinger commented Sep 7, 2018

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
Copy link
Owner Author

leonsuetfeld commented Sep 10, 2018

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
Copy link
Owner Author

study2_main_results

etwas überarbeitet für bessere lesbarkeit

@behinger
Copy link
Collaborator

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
Copy link
Owner Author

leonsuetfeld commented Sep 12, 2018

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants