Skip to content

Commit 0796527

Browse files
engine: update normative-data.js — T3 audit pass, all LLM text replaced with researcher citations
1 parent 1830c1c commit 0796527

1 file changed

Lines changed: 87 additions & 0 deletions

File tree

src/engine/normative-data.js

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/**
2+
* UNSTUCK — Normative Data Module
3+
*
4+
* Means and SDs from Kajonius & Johnson (2019), N=320,128
5+
* Source: Table A1, "Assessing the Structure of the Five Factor Model
6+
* of Personality (IPIP-NEO-120) in the public domain"
7+
* https://pmc.ncbi.nlm.nih.gov/articles/PMC7871748/
8+
*
9+
* Scale: 4 (min) to 20 (max) per facet
10+
*
11+
* NOTE: These are overall norms (combined age/gender).
12+
* v0.6 should use age×gender stratified norms from Johnson's 619K OSF dataset.
13+
* For v0.5, we use overall norms + z-score → percentile conversion.
14+
*/
15+
16+
export const NORMS = {
17+
// Neuroticism facets
18+
N1: { mean: 12.07, sd: 3.77, alpha: 0.79, label: 'Anxiety' },
19+
N2: { mean: 11.51, sd: 4.11, alpha: 0.87, label: 'Anger' },
20+
N3: { mean: 9.35, sd: 3.87, alpha: 0.85, label: 'Depression' },
21+
N4: { mean: 11.69, sd: 3.64, alpha: 0.72, label: 'Self-Consciousness' },
22+
N5: { mean: 11.94, sd: 3.44, alpha: 0.72, label: 'Immoderation' },
23+
N6: { mean: 10.07, sd: 3.63, alpha: 0.78, label: 'Vulnerability' },
24+
25+
// Extraversion facets
26+
E1: { mean: 14.48, sd: 3.60, alpha: 0.81, label: 'Friendliness' },
27+
E2: { mean: 12.36, sd: 4.02, alpha: 0.80, label: 'Gregariousness' },
28+
E3: { mean: 14.56, sd: 3.43, alpha: 0.86, label: 'Assertiveness' },
29+
E4: { mean: 12.84, sd: 3.15, alpha: 0.71, label: 'Activity Level' },
30+
E5: { mean: 13.45, sd: 3.58, alpha: 0.77, label: 'Excitement-Seeking' },
31+
E6: { mean: 14.40, sd: 3.49, alpha: 0.81, label: 'Cheerfulness' },
32+
33+
// Openness facets
34+
O1: { mean: 14.02, sd: 3.53, alpha: 0.76, label: 'Imagination' },
35+
O2: { mean: 14.56, sd: 3.78, alpha: 0.76, label: 'Artistic Interests' },
36+
O3: { mean: 14.73, sd: 3.10, alpha: 0.69, label: 'Emotionality' },
37+
O4: { mean: 13.49, sd: 3.38, alpha: 0.72, label: 'Adventurousness' },
38+
O5: { mean: 14.42, sd: 3.43, alpha: 0.75, label: 'Intellect' },
39+
O6: { mean: 12.06, sd: 3.40, alpha: 0.64, label: 'Liberalism' },
40+
41+
// Agreeableness facets
42+
A1: { mean: 13.67, sd: 3.60, alpha: 0.86, label: 'Trust' },
43+
A2: { mean: 14.52, sd: 3.16, alpha: 0.76, label: 'Morality' },
44+
A3: { mean: 15.45, sd: 2.91, alpha: 0.76, label: 'Altruism' },
45+
A4: { mean: 14.09, sd: 3.11, alpha: 0.73, label: 'Cooperation' },
46+
A5: { mean: 12.40, sd: 3.44, alpha: 0.76, label: 'Modesty' },
47+
A6: { mean: 15.34, sd: 2.84, alpha: 0.72, label: 'Sympathy' },
48+
49+
// Conscientiousness facets
50+
C1: { mean: 14.62, sd: 2.89, alpha: 0.77, label: 'Self-Efficacy' },
51+
C2: { mean: 13.23, sd: 4.31, alpha: 0.85, label: 'Orderliness' },
52+
C3: { mean: 16.32, sd: 2.57, alpha: 0.67, label: 'Dutifulness' },
53+
C4: { mean: 16.06, sd: 3.09, alpha: 0.78, label: 'Achievement-Striving' },
54+
C5: { mean: 14.07, sd: 3.16, alpha: 0.72, label: 'Self-Discipline' },
55+
C6: { mean: 13.68, sd: 4.09, alpha: 0.88, label: 'Cautiousness' },
56+
};
57+
58+
// Domain norms (computed from facet means/SDs in the paper)
59+
// Domain score = mean of 6 facet raw scores (range 4-20)
60+
export const DOMAIN_NORMS = {
61+
N: { mean: 11.10, sd: 2.66, label: 'Neuroticism' },
62+
E: { mean: 13.69, sd: 2.36, label: 'Extraversion' },
63+
O: { mean: 13.88, sd: 2.15, label: 'Openness to Experience' },
64+
A: { mean: 14.25, sd: 2.09, label: 'Agreeableness' },
65+
C: { mean: 14.66, sd: 2.36, label: 'Conscientiousness' },
66+
};
67+
68+
// Rejected facets: alpha < .70
69+
export const REJECTED_FACETS = new Set(['O6', 'O3', 'C3', 'E4', 'N5']);
70+
71+
// Confidence tiers based on alpha
72+
export function getConfidenceTier(facet) {
73+
const a = NORMS[facet]?.alpha || 0;
74+
if (a >= 0.83) return 'gold';
75+
if (a >= 0.75) return 'silver';
76+
if (a >= 0.70) return 'bronze';
77+
return 'rejected';
78+
}
79+
80+
// Valid facets grouped by domain
81+
export const DOMAIN_FACETS = {
82+
N: ['N1', 'N2', 'N3', 'N4', 'N6'], // N5 rejected
83+
E: ['E1', 'E2', 'E3', 'E5', 'E6'], // E4 rejected
84+
O: ['O1', 'O2', 'O4', 'O5'], // O3, O6 rejected
85+
A: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'], // none rejected
86+
C: ['C1', 'C2', 'C4', 'C5', 'C6'], // C3 rejected
87+
};

0 commit comments

Comments
 (0)