Open DominiqueMakowski opened 2 months ago
p
= participant name. Stored in the data. Useful for test-retest.s
= study name. Default to nothing (empty). Stored in the datal1n
= level 1 total number of trials (N_trials
)osf
= OSF component code to send the data to (via datapipe)(I'm tagging @BenjaminTribe so that he follows the development)
Further polishing touches:
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]
Can we have like instead of the down arrow written as text, having like a down arrow key "logo"? Something like that
Down key
" if people don't - as it could indicate that people don't know what to doThe 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
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?
Thanks for these precisions, very helpful.
medianRT is initialised to maxRT/2
But what happened on the first trial?
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
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?
Save bone location and screen info
Yeah, that's a good idea!
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
Throw noise is annoying?
Lol well you've been overexposed to the game to be fair. But yeah it kinda is haha
"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")
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
empty strings are also indicative of an error so I've returned something specific for now
👌
as this would end up with negative values
👌
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?
Just tested, it feels quite good now I'd say!
Two graphic things:
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
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).
I managed to nicely download & open the data from Python, amazing stuff @Max-Lovell !
userAgentString
trial_n
for trial_number
or trialNumber
(to keep consistency with the other keys)trialType
asz responseType
maybe? (because it's a function of the response not of the trial per se)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.
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