Sussex-Psychology-Software-Team / DoggoNogo

Gamified response inhibition reaction time tasks
https://sussex-psychology-software-team.github.io/DoggoNogo/?datapipe=AlXXHjfLwVP3&p=John%20Smith&s=Original%20Study&l1n=60
1 stars 1 forks source link

Improvements #1

Open DominiqueMakowski opened 2 months ago

DominiqueMakowski commented 2 months ago
DominiqueMakowski commented 2 months ago
DominiqueMakowski commented 3 weeks ago

(I'm tagging @BenjaminTribe so that he follows the development)

Further polishing touches:

Landing screen

Doggo/Nogo: The Game This game was designed by psychologists to accurately assess your cognitive reflexes. At the end of the level, you will receive information about your score. [in slightly smaller]By playing, you agree that your data will be anonymously collected for scientific research. You can find more information by clicking here [maybe a URL to the README page for now as we don't have anything better]

Introduction

Instruction screen

image

Can we have like instead of the down arrow written as text, having like a down arrow key "logo"? Something like that image

Game

DominiqueMakowski commented 3 weeks ago

Burnin period

The game seems quite hard, so it might we worth to it to introduce a burn-in period where it's easy at the beginning and gets progressively harder

How about:

The threshold (and also the upper limit) get adjusted by the following:

What that means is that for the first trial (aka n_trial=0): threshold = threshold + threshold*1 (so basically it gets doubled) Then this benefit progressively lowers as n_trial increases until it becomes 0 after 10 trials

Max-Lovell commented 2 weeks ago

Firstly, some implementation notes to consider:

Some ideas:

Replies to above:

"Add "green" blinking"

Unsure about this?

Add throw sound at the end of trial when no response has been made (to mark the onset of a new trial)

I think this works as the feedback for a Missed trial - then each trial has a signal for it's end, after which a new trial begins when the feedback text is wiped.

Make sure the value of "ISI" corresponds to the time between last key press and next stimulus (i.e., adjust it for animation buffer if needs be)

So, l've purposefully written all animations to be based on a pre-specified duration for this. currently the longest one is the bone being thrown away on missed trials, which takes 1 second. There's also a 1 second delay between trials. A new trial is signified by the feedback text being removed - this is when the ISI timer starts. Our ISIs at the moment are at their least 1 second, which means if that was included in the animation time, there would be no trial. I think if we're signalling the end of a trial with animated feedback, that signals also a time for participants to have a break before they are in that readiness state waiting for the next stimulus. my 2¢ anyway.

Default to nothing (empty)

All URL variables default to 'query variable not found' if that is the case - empty strings are also indicative of an error so I've returned something specific for now.

l1n = level 1 total number of trials (N_trials)

we don't control the number of trials per level - levels are controlled by score, and there isn't anything specific about level 1. I've implemented this as an optional control for the nTrials variable, which is essentially an estimated total trials used by the function which is used in the calculation of the max score for the next stage. I think this var name should be changed?

Threshold = Threshold + Threshold*(1-n_trial/10)

done with min(0, (1-n_trial/10)) as this would end up with negative values

Mechanism problem: if one starts to have slow trials, then the slow trials are succeeding super fast, leading to a cycle of losing. Maybe Probably we want to increase the upper threshold if response is > upper limit (e.g., by +100ms)

So are you saying if rt > maxRT, maxRT += 100? Can we avoid saying 'threshold' if it's getting used to describe medianRT and maxRT?

DominiqueMakowski commented 2 weeks ago

Thanks for these precisions, very helpful.

  1. medianRT is initialised to maxRT/2

But what happened on the first trial?

  1. maxRT = 2medianRT, but has minimum of minRT2

My hunch is that the minimum safety fallback isn't necessary, I don't think it's mathematically possible to have 2median RT to be < to 2minRT

  1. Early presses and misses count are recorded as individual 'trials'

Mmh indeed we might want to separate early presses from the rest because if I understand, when people do early presses it still lowers the amount of "real" trials right?

  1. Save bone location and screen info

Yeah, that's a good idea!

  1. Use spacebar for lefties

I think that lefties are also used to use the arrow keys? But that makes me think that @BenjaminTribe we should add a handedness question if the demographics of study 1

  1. Throw noise is annoying?

Lol well you've been overexposed to the game to be fair. But yeah it kinda is haha

  1. "Add "green" blinking"

Yeah, that's probably useless. However, I would like to add sparkles upon "evolution" (and potentially even a pause, like the doggo evolves, and then it's like "press down arrow to continue")

  1. a time for participants to have a break before they are in that readiness state waiting for the next stimulus

Yeah, as long as that minimum time is 1s (in real time, i.e., including the animation) I'm happy

  1. empty strings are also indicative of an error so I've returned something specific for now

👌

  1. as this would end up with negative values

👌

  1. Can we avoid saying 'threshold' if it's getting used to describe medianRT and maxRT?

Okay yes fair that's confusing. In my mind there's the "threshold" for fast/slow answers (both are valid), which is currently operationalized as medianRT (but could be something else, that's why I used to say threshold to be more general but yes), and the "MaxRT", which is the maximum time for the window in which people can make valid answers. But yes let's be more specific.

So are you saying if rt > maxRT, maxRT += 100?

Yes, what do you think?

DominiqueMakowski commented 2 weeks ago

Just tested, it feels quite good now I'd say!

Two graphic things:

image

In general, the text doesn't look super sharp (it looks a bit like text on an image that was stretched), I'm not sure if it is because of the outline, or the arbitrary scaling etc - not sure we can do anything about that though

DominiqueMakowski commented 2 weeks ago

Using Median(RT) (i.e., the 50th percentile) as a threshold makes it quite challenging and punitive (well, not as much as Dark Souls), perhaps in the future an offshoot study could test the effect of a gentler threshold (e.g., 75th percentile) on fun and engagement :) (maybe the percentile level could be a URL var for easy changes - in a future version).

DominiqueMakowski commented 2 weeks ago

image

I managed to nicely download & open the data from Python, amazing stuff @Max-Lovell !

Max-Lovell commented 2 weeks ago

Nice, thanks for the feedback, I'm off next week but some notes for me when I get back:

RT task

Data

End screen

Programming generally

But what happened on the first trial?

Didn't know what to do with it so just kinda arbitratily halved the maxRT. Actually just changed it to the midpoint between min and max.

My hunch is that the minimum safety fallback isn't necessary, I don't think it's mathematically possible to have 2median RT to be < to 2minRT

Can't remember what happened to make me put that in tbh - I guess I got some error. I'll take out and we can see how it goes.

Mmh indeed we might want to separate early presses from the rest because if I understand, when people do early presses it still lowers the amount of "real" trials right?

Yeah they increase the trial number and lower the score.

I think that lefties are also used to use the arrow keys?

Son of a bitch you're right. But also spacebar is just a lot more comfortable to use with your lefthand, spacebar is big and in the middle so generally easier. Up2u

Yes, what do you think?

Mmm if someone stepped away from the computer it'd screw up the system a bit - is there a more objective way to put an upper limit on reaction times?

There's probably an issue with userAgentString

looks fine but you'll need a special parser to get the data out, unless you tried that? It's a super annoying format, no idea how we ended up with this system tbh, but it's the only info we'll get automatically.

DominiqueMakowski commented 2 weeks ago

Add in separate 'trial count' variable to record only slow and fast (and missed?) trials

Maybe to simplify this we could just add a field trialValid: true that would be false for early presses and all computations based on the number of trials would only take into account where trialValid is True (but I'm fairly happy with how the data is formatted now because it's straightforward to put all trials into a dataframe (since they have consistent fields) and then filter out and keep only the valid ones