compileprofile-spacetests 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CLAUDE.md +114 -114
  2. package/README.md +171 -147
  3. package/dist/cjs/common-interfaces.d.ts +33 -1
  4. package/dist/cjs/gonogo.js +89 -57
  5. package/dist/cjs/nback.d.ts +6 -2
  6. package/dist/cjs/nback.js +132 -2
  7. package/dist/cjs/spatial-cognition.js +0 -2
  8. package/dist/esm/common-interfaces.d.ts +33 -1
  9. package/dist/esm/gonogo.js +89 -57
  10. package/dist/esm/nback.d.ts +6 -2
  11. package/dist/esm/nback.js +128 -2
  12. package/dist/esm/spatial-cognition.js +0 -2
  13. package/example-data/emotions.json +807 -807
  14. package/example-data/gonogo.json +5392 -5392
  15. package/example-data/nback.json +892 -892
  16. package/example-data/participant.json +6 -6
  17. package/example-data/spatial-cognition.json +462 -462
  18. package/jest.config.js +13 -13
  19. package/original/emotion-recognition.R +39 -39
  20. package/original/gonogo.R +32 -32
  21. package/package.json +40 -40
  22. package/src/__tests__/integration/browserInfo.test.ts +16 -16
  23. package/src/__tests__/integration/emotions.test.ts +172 -172
  24. package/src/__tests__/integration/gonogo.test.ts +293 -183
  25. package/src/__tests__/integration/nback-versions.test.ts +182 -0
  26. package/src/__tests__/integration/nback.test.ts +148 -148
  27. package/src/__tests__/integration/spatial-cognition.test.ts +171 -171
  28. package/src/__tests__/test-utils/testData.ts +79 -79
  29. package/src/common-interfaces.ts +124 -78
  30. package/src/emotions.ts +98 -98
  31. package/src/getters.ts +21 -21
  32. package/src/gonogo.ts +149 -127
  33. package/src/index.ts +39 -39
  34. package/src/nback.ts +182 -61
  35. package/src/spatial-cognition.ts +110 -112
  36. package/tsconfig.cjs.json +12 -12
  37. package/tsconfig.esm.json +14 -14
package/dist/esm/nback.js CHANGED
@@ -1,7 +1,28 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
1
12
  // from the passed json extract those objects that have field is_target
13
+ // Version 1 trials have no n_back field and get exactly the original result. Version 2 trials
14
+ // (n_back, block, block_index on each trial) also get special.by_block and special.by_nback.
2
15
  var nback_calculate_results = function (obj) {
3
16
  var trials = nback_extract_trials(obj);
4
- return nback_results(trials);
17
+ var results = nback_results(trials);
18
+ if (nback_is_versioned(trials)) {
19
+ results.special.by_block = nback_results_by_block(trials);
20
+ results.special.by_nback = nback_results_by_nback(trials);
21
+ }
22
+ return results;
23
+ };
24
+ var nback_is_versioned = function (trials) {
25
+ return trials.some(function (t) { return t.n_back !== undefined && t.n_back !== null; });
5
26
  };
6
27
  var nback_extract_trials = function (obj) {
7
28
  var trials = obj.filter(function (o) { return 'is_target' in o; });
@@ -46,4 +67,109 @@ var nback_results = function (trials) {
46
67
  console.log(results);
47
68
  return results;
48
69
  };
49
- export { nback_extract_trials, nback_results, nback_calculate_results };
70
+ // Standard normal CDF (Marsaglia 2004, Taylor series; absolute error ~1e-15 for |x| < 8)
71
+ var normal_cdf = function (x) {
72
+ var sum = x, term = x, prev = 0;
73
+ var x2 = x * x;
74
+ for (var i = 3; sum !== prev; i += 2) {
75
+ prev = sum;
76
+ term *= x2 / i;
77
+ sum = prev + term;
78
+ }
79
+ return 0.5 + sum * Math.exp(-0.5 * x2 - 0.91893853320467274178);
80
+ };
81
+ // Inverse of the standard normal CDF: Acklam's rational approximation, polished with one
82
+ // Halley step against normal_cdf, as Acklam recommends. Accurate to ~1e-12 for 1e-10 < p < 1 - 1e-10.
83
+ var inverse_normal = function (p) {
84
+ if (p <= 0)
85
+ return -Infinity;
86
+ if (p >= 1)
87
+ return Infinity;
88
+ var x = acklam_inverse_normal(p);
89
+ var e = normal_cdf(x) - p;
90
+ var u = e * Math.sqrt(2 * Math.PI) * Math.exp(x * x / 2);
91
+ return x - u / (1 + x * u / 2);
92
+ };
93
+ var acklam_inverse_normal = function (p) {
94
+ var a = [-3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02,
95
+ 1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00];
96
+ var b = [-5.447609879822406e+01, 1.615858368580409e+02, -1.556989798598866e+02,
97
+ 6.680131188771972e+01, -1.328068155288572e+01];
98
+ var c = [-7.784894002430293e-03, -3.223964580411365e-01, -2.400758277161838e+00,
99
+ -2.549671010322563e+00, 4.374664141464968e+00, 2.938163982698783e+00];
100
+ var d = [7.784695709041462e-03, 3.224671290700398e-01, 2.445134137142996e+00,
101
+ 3.754408661907416e+00];
102
+ var p_low = 0.02425;
103
+ if (p < p_low) {
104
+ var q_1 = Math.sqrt(-2 * Math.log(p));
105
+ return (((((c[0] * q_1 + c[1]) * q_1 + c[2]) * q_1 + c[3]) * q_1 + c[4]) * q_1 + c[5]) /
106
+ ((((d[0] * q_1 + d[1]) * q_1 + d[2]) * q_1 + d[3]) * q_1 + 1);
107
+ }
108
+ if (p > 1 - p_low)
109
+ return -acklam_inverse_normal(1 - p);
110
+ var q = p - 0.5;
111
+ var r = q * q;
112
+ return (((((a[0] * r + a[1]) * r + a[2]) * r + a[3]) * r + a[4]) * r + a[5]) * q /
113
+ (((((b[0] * r + b[1]) * r + b[2]) * r + b[3]) * r + b[4]) * r + 1);
114
+ };
115
+ var mean_or_null = function (xs) {
116
+ return xs.length > 0 ? xs.reduce(function (s, x) { return s + x; }, 0) / xs.length : null;
117
+ };
118
+ var responded = function (t) { return t.response !== null && t.response !== undefined; };
119
+ // d' uses the log-linear correction (Hautus 1995), so it stays finite at 0 % or 100 % rates
120
+ var nback_group_results = function (trials) {
121
+ var targets = trials.filter(function (t) { return t.is_target; });
122
+ var non_targets = trials.filter(function (t) { return !t.is_target; });
123
+ var hits = targets.filter(responded);
124
+ var false_alarms = non_targets.filter(responded);
125
+ var lures = non_targets.filter(function (t) { return t.is_lure === true; });
126
+ var lure_false_alarms = lures.filter(responded).length;
127
+ var n_correct = trials.filter(function (t) { return t.correct === true; }).length;
128
+ var rts = function (ts) { return ts.map(function (t) { return t.rt; }).filter(function (rt) { return typeof rt === 'number'; }); };
129
+ return {
130
+ n_trials: trials.length,
131
+ n_correct_trials: n_correct,
132
+ performance_score: trials.length > 0 ? n_correct * 100 / trials.length : 0,
133
+ n_targets: targets.length,
134
+ n_non_targets: non_targets.length,
135
+ hits: hits.length,
136
+ misses: targets.length - hits.length,
137
+ false_alarms: false_alarms.length,
138
+ correct_rejections: non_targets.length - false_alarms.length,
139
+ hit_rate: targets.length > 0 ? hits.length / targets.length : null,
140
+ false_alarm_rate: non_targets.length > 0 ? false_alarms.length / non_targets.length : null,
141
+ d_prime: targets.length > 0 && non_targets.length > 0
142
+ ? inverse_normal((hits.length + 0.5) / (targets.length + 1))
143
+ - inverse_normal((false_alarms.length + 0.5) / (non_targets.length + 1))
144
+ : null,
145
+ n_lures: lures.length,
146
+ lure_false_alarms: lure_false_alarms,
147
+ lure_false_alarm_rate: lures.length > 0 ? lure_false_alarms / lures.length : null,
148
+ avg_rt_hits: mean_or_null(rts(hits)),
149
+ avg_rt_false_alarms: mean_or_null(rts(false_alarms)),
150
+ };
151
+ };
152
+ var nback_results_by_block = function (trials) {
153
+ var blocks = new Map();
154
+ for (var _i = 0, trials_1 = trials; _i < trials_1.length; _i++) {
155
+ var t = trials_1[_i];
156
+ if (!blocks.has(t.block_index))
157
+ blocks.set(t.block_index, []);
158
+ blocks.get(t.block_index).push(t);
159
+ }
160
+ return Array.from(blocks.entries())
161
+ .sort(function (_a, _b) {
162
+ var a = _a[0];
163
+ var b = _b[0];
164
+ return a - b;
165
+ })
166
+ .map(function (_a) {
167
+ var block_index = _a[0], ts = _a[1];
168
+ return (__assign({ block: ts[0].block, block_index: block_index, n_back: ts[0].n_back }, nback_group_results(ts)));
169
+ });
170
+ };
171
+ var nback_results_by_nback = function (trials) {
172
+ var levels = Array.from(new Set(trials.map(function (t) { return t.n_back; }))).sort(function (a, b) { return a - b; });
173
+ return levels.map(function (n_back) { return (__assign({ n_back: n_back }, nback_group_results(trials.filter(function (t) { return t.n_back === n_back; })))); });
174
+ };
175
+ export { nback_extract_trials, nback_results, nback_calculate_results, nback_group_results, nback_results_by_block, nback_results_by_nback, inverse_normal };
@@ -19,11 +19,9 @@ var spatial_extract_trials = function (obj) {
19
19
  var spatial_results = function (obj) {
20
20
  var correct_trials = obj.filter(function (o) { return o.correct === 1 || o.correct === true; });
21
21
  var incorrect_trials = obj.filter(function (o) { return o.correct === 0 || o.correct === false; });
22
- var missing_trials = obj.filter(function (o) { return o.response === null || o.response === undefined; });
23
22
  var total_rt = obj.reduce(function (a, b) { return a + (b.rt || 0); }, 0);
24
23
  var correct_rt = correct_trials.reduce(function (a, b) { return a + (b.rt || 0); }, 0);
25
24
  var incorrect_rt = incorrect_trials.reduce(function (a, b) { return a + (b.rt || 0); }, 0);
26
- var missing_rt = missing_trials.reduce(function (a, b) { return a + (b.rt || 0); }, 0);
27
25
  var avg_rt = obj.length > 0 ? total_rt / obj.length : 0;
28
26
  var avg_acc = obj.length > 0 ? correct_trials.length / obj.length : 0;
29
27
  var performance_score = calculate_performance_score(avg_rt, avg_acc);