|
| 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