Written entirely by Claude, as a working record for agents more than for human readers: every number with its source file, and every claim since withdrawn. Some facts here may be out of date; where it disagrees with the post, trust the post. For the readable version, see the companion.
Factor analysis of the adapter Gram
Principal axis factoring with oblimin rotation on the 134x134 trait correlation matrix; parallel analysis chose 9, five were also extracted because five is the hypothesis, and no Goldberg congruence clears 0.85.
- What is factored
- PCA versus PAF: two different matrices
- How many factors
- Elbow plots and null arms
- The k=5 solution
- Does an evaluative factor survive rotation
- Communality
- The k=9 solution and the steering hand-off
- Qualitative reads
- Factor chart
- Does any of this depend on the metric?
- The factors in the training gradients, before training (added 2026-09-10)
- The 2026-10-30 post on the number of factors
What is factored
qwen35/analyse_fa_qwen35.py reads results/gram_sweep.npz - the exact
134x134 Gram - and factors the trait correlation matrix derived from it.
Two matrices are run throughout:
- uncentred:
R = G / outer(d, d), plain cosine. - centred (ipsatised): the grand mean removed by double-centring,
H = I - 11^T/p,Gc = H G H, thenRc = Gc / outer(dc, dc).
Off-diagonal statistics (qwen35/results/fa_qwen35.md, section 2):
| off-diagonal mean | sd | min | max | eigenvalues 1-6 | |
|---|---|---|---|---|---|
| raw cosine (uncentred) | +0.0721 | 0.1627 | -0.397 | +0.622 | 16.78, 13.55, 10.85, 5.82, 3.27, 2.95 |
| ipsatised | -0.0074 | 0.1672 | -0.432 | +0.584 | 16.62, 14.29, 6.48, 4.97, 3.45, 2.78 |
Off-diagonal agreement between the two: r = 0.9556. Uncentred condition
number 49.4. Ipsatisation removes exactly one dimension, so R_centred has rank
p-1, its smallest eigenvalue is 0 and SMC is identically 1, which is why the
centred run starts PAF from ridge-SMC (ridge = 0.001).
The 34 Lexicon traits are factored but score 0 in every congruence target, so
congruence is judged on the 100 Goldberg markers only
(fa_qwen35.md, section 6 target definition). See Trait provenance.
The file's own verification section reports all_ok = True across seven checks
(hand eigendecomposition, SMC vs explicit OLS, varimax recovering known
structure, two varimax algorithms agreeing, oblimin on known oblique structure,
Tucker hand case, PAF recovering a known model).
PCA versus PAF: two different matrices
The blog page draws the two decompositions side by side and refuses to put them
on one axis. qwen35/build_blog_page.py, scree_svg() docstring:
LEFT is PCA of the adapter cloud: eigenvalues of the double-centred Gram of the 134 weight updates, in per cent of total variance. ... RIGHT is the factor-analytic question, which is a different matrix and a different quantity: eigenvalues of the 134x134 trait correlation matrix with the diagonal REDUCED to communality estimates ... Principal axis factoring partitions common variance, not total variance, so its eigenvalues are smaller, can go negative, and its elbow is not the PCA elbow.
The PCA side is PCA, the scree curve and the two nulls.
How many factors
Reduced (SMC-diagonal) centred eigenvalues, ranks 1-15
(fa_qwen35.md, section 3): 16.514, 14.180, 6.367, 4.859, 3.336, 2.668, 1.969,
1.710, 1.402, 1.284, 1.200, 1.148, 1.104, 1.031, 1.006.
- Kaiser (unreduced eigenvalue > 1): 16 uncentred, 18 centred.
- Reduced eigenvalues > 1: 9 (uncentred).
Horn's parallel analysis, 95th percentile, first crossing, 500 reps per cell
(fa_qwen35.md section 3; the same grid is
qwen35/results/fa_qwen35.json#n_factors.parallel_analysis_uncentred.grid):
| N | uncentred k (unreduced) | uncentred k (SMC-reduced) | centred k (unreduced) | centred k (SMC-reduced) |
|---|---|---|---|---|
| 150 | 5 | 4 | 5 | 5 |
| 300 | 7 | 7 | 6 | 6 |
| 1000 | 8 | 9 | 8 | 8 |
| 1528 | 9 | 12 | 9 | 9 |
| 5809 | 10 | 24 | 12 | 12 |
| 20000 | 13 | 32 | 14 | 15 |
#n_factors.reference_N = 1528. The chosen number is stated in the report as
Chosen k = 9 (k = Horn's original (unreduced, 95th-percentile) parallel analysis on the ipsatised matrix at N=1528. ... N=1528 is carried over from sweep100's lower estimate (m in [1528, 5809]). ... Solutions are also extracted at exactly 5 because 5 is the hypothesis.)
The same analysis run on the two matched null arms retains zero factors on the shuffled arm and eight on the permuted arm, neither with any Big Five congruence: Factor analysis of the null arms. Whether the factors themselves replicate across LoRA seeds is not settled by the per-direction check that was run for it - see Per-direction seed stability, and why the check is uninformative - and What has been done to the PCs but not to the factors audits which of the wiki's analyses exist for the factors and which only for the principal components.
There is no true N: these are 134 weight updates, not 134 questionnaire respondents, and the reference figure is an effective dimensionality carried over from an earlier sweep with no reseed controls here to re-estimate it. The blog page states the consequence plainly: "Five factors is a choice, made so the solution can be compared with the Big Five, and the data does not pick it."
Note for anyone rebuilding the figure: the blog page's right-hand panel reads
n_factors.parallel_analysis_uncentred even though the chosen-k rationale in
fa_qwen35.md is phrased in terms of the ipsatised matrix. At N=1528 both give
9 unreduced, so the marks drawn ("5 extracted", "12 retained") are unaffected.
Elbow plots and null arms
Solid coloured lines are the observed eigenvalues of the two real stages, top 20 of 134; dashed grey lines are the 95th percentile of eigenvalues from random data with the same number of variables, at sample size N = 150 and N = 1528 (Horn's parallel analysis, 500 replicates). Components above the null line count as structure. Stage one: 9 PCA components and 9 PAF factors above the N = 1528 null, chosen k = 9. Stage two: 7 and 7 above the N = 1528 null, chosen k = 7; at N = 150 only 1 stage-two component clears the null. Stage one drops from 16.6 to 6.5 after two components and reaches the null around component nine; stage two starts at 4.1 and is within a factor of two of the null from the first component.
The two thin grey lines are the matched null arms (The null control arms): shuffled (preference direction destroyed on half of every trait's pairs, chosen k = 0) and permuted (each trait name given another trait's intact pairs under a derangement, chosen k = 8). Both have 100 variables against the real arms' 134, and a correlation matrix has trace p, so their eigenvalues are not on the same scale as the coloured lines and each arm's retained count is judged against its own p = 100 random-data null, not against the dashed lines drawn here. Values below 0.25 are drawn at the 0.25 floor of the log axis. Sources: qwen35/results/fa_qwen35.json, fa_qwen35_stage2.json, fa_qwen35_null_shuffled.json and fa_qwen35_null_permuted.json, key n_factors.parallel_analysis_centred; counts across arms in qwen35/analysis/fa_nulls.json. Generated by wiki/tools/gen_scree_svg.py.
The k=5 solution
Four solutions were extracted (centred_k5, centred_k9, uncentred_k5,
uncentred_k9), each unrotated, varimax and oblimin. PAF converged in 8-12
iterations with 0 Heywood cases in every one (fa_qwen35.md section 4). The
solution the project uses is centred_k5, oblimin (direct oblimin, gamma = 0);
its factor intercorrelations are small (largest |Phi| 0.282, mean 0.120,
section 5).
Five factors, ordered by SS loading, with the project's names
(qwen35/analysis/fa_summary.json#centred_k5.factors[].name, mapped to the blog
page's display titles by FA_KEY in qwen35/build_blog_page.py):
| solution name | blog title | slug | SS loading | best Goldberg match | Tucker phi | Eval phi |
|---|---|---|---|---|---|---|
| Warmth / prosociality | Warmth | FA_Warmth (Warmth / prosociality) | 10.76 | A | +0.655 | +0.295 |
| Competence | Competence | FA_Competence (Competence) | 8.42 | C | +0.574 | +0.315 |
| Fearful withdrawal | Timidity | FA_FearfulWithdrawal (Timidity) | 7.02 | ES | +0.405 | +0.288 |
| Arousal / activation | Arousal | FA_Arousal (Arousal / activation) | 6.81 | E | +0.539 | +0.028 |
| Imagination | Imagination | FA_Imagination (Imagination) | 5.80 | I | +0.682 | +0.258 |
(fa_qwen35.md section 6, centred_k5 oblimin table, and section 7 headers.)
The blog page displays the solution's "Fearful withdrawal" as Timidity
(since 2026-09-11; "Fearful withdrawal" from 2026-09-08, "Approach and
Avoidance" before that). The change is display only: the underlying direction,
npz slug and steering job are all FA_FearfulWithdrawal, and the solution's own
label in fa_summary.json is unchanged. See FA_FearfulWithdrawal (Timidity).
The full congruence row for that solution (fa_qwen35.md section 6, "Which
Goldberg factors clear the thresholds?"):
centred_k5, oblimin -- best congruence per Goldberg factor: E 0.539, A 0.655, C 0.574, ES 0.405, I 0.682. Clearing 0.85 (fair): none. Clearing 0.95 (equivalent): none.
The same holds for centred_k9 (E 0.406, A 0.644, C 0.556, ES 0.487, I 0.616), uncentred_k5 (0.329 / 0.536 / 0.490 / 0.393 / 0.575) and uncentred_k9 (0.374 / 0.629 / 0.536 / 0.464 / 0.636). No solution clears the conventional "fair" congruence bar against any Goldberg factor. The recovery is real and ordered but it is not equivalence, and any wording that implies the Big Five was reproduced should say so.
A note on the maintainer's recollection: the figures recalled as
"Warmth~A 0.66, Competence~C 0.57, Imagination~I ~0.6, Fearful withdrawal
ES 0.41 / E 0.34, Arousal E 0.54 / ES -0.35" are right except for Imagination,
which is +0.682, not about 0.6. The paired secondary values are also in the
table: Timidity loads E +0.338 alongside ES +0.405, and Arousal loads
ES -0.348 alongside E +0.539 (fa_qwen35.md, centred_k5 oblimin).
Does an evaluative factor survive rotation
fa_qwen35.md section 8. The "Eval" target is +1/-1 by keying for every primary
trait. A perfectly clean Goldberg factor already scores 0.447 on it by
construction.
| solution | rotation | max Eval congruence | which factor |
|---|---|---|---|
| centred_k5 | unrotated | 0.585 | F4 |
| centred_k5 | varimax | 0.273 | F3 |
| centred_k5 | oblimin | 0.315 | F2 |
| centred_k9 | unrotated | 0.584 | F4 |
| centred_k9 | oblimin | 0.349 | F5 |
| uncentred_k5 | unrotated | 0.426 | F4 |
| uncentred_k5 | oblimin | 0.291 | F3 |
| uncentred_k9 | oblimin | 0.342 | F9 |
An evaluative ("good trait / bad trait") factor is visible before rotation and falls below the construction baseline after it.
Communality
fa_qwen35.md section 9: mean communality h^2 is 0.317 for centred_k5
(u^2 0.683, range 0.051-0.516), 0.360 for centred_k9, 0.352 for uncentred_k5,
0.402 for uncentred_k9. There are no reseed controls in this sweep, so the
noise-floor comparison an earlier sweep ran cannot be reproduced and the
communalities have no reliability ceiling to be read against.
The k=9 solution and the steering hand-off
qwen35/analysis/fa_summary.json#centred_k9 stores nine factors with
name = null - the k=9 factors were never named. Their SS loadings and top
traits: 6.43 (untalkative, disorganized, extraverted, haphazard, quiet),
5.61 (timid, shy, bashful, guilty, weak-hearted), 5.47 (neat, unintellectual,
negligent, casual, conscientious), 5.00 (vigorous, bold, practical, gruff,
efficient), 4.89 (warm, kind, mothering, cooperative, engaging), 4.22
(impractical, unimaginative, imaginative, creative, innovative), 2.75
(self-pitying, moody, touchy, emotional, melancholy), 2.73 (uninquisitive, deep,
fretful, careful, uncertain), 2.26 (envious, selfish, jealous, crooked,
distrustful).
fa_qwen35.md section 10 records that
steering.oblimin_loadings holds the nine-column oblimin pattern of
centred_k9, and that steer134_on_modal.py's fa_coeffs turns column j into
the fa{j} steering direction (mean-centred, unit norm in the double-centred
Gram metric). Best Goldberg match per column: fa1 = E (0.41), fa2 = E (0.36),
fa3 = C (0.56), fa4 = E (0.28), fa5 = A (0.64), fa6 = I (0.62), fa7 = ES (0.49),
fa8 = I (0.43), fa9 = A (0.44). So the fa* directions that appear in the
steering corpus are the nine-factor solution, while the five named factor
cards on the blog page are the five-factor solution - a naming collision
worth knowing about when reading Steering the base model along weight-space directions.
Qualitative reads
qwen35/analysis/qual_fa.json and qual_fa_notes.md hold a blind read of the
steered transcripts for the five factors plus PC4-PC6, from
phase10_runs/steer_results_fix2.json, judged with
phase10_runs/judged_steerfix23.json. Both record that about 59% of responses
end mid-sentence (512-token cap) so nothing there claims anything about how a
response concludes, and that zero false identity claims occur across all
eight directions at any alpha. qual_fa_notes.md also reports damage-corrected
slopes: seven of the eight directions keep their leading judged scale on the
subset of prompts that never loop; the one that does not is
FA_FearfulWithdrawal.
Factor chart
Since 2026-09-08 this solution is the project's primary frame, and
qwen35/fa_chart.py is the single module that turns it into coordinates. Full
reference on The factor chart; the essentials:
- The five factors are used as directions in adapter space, weighted merges
v_f = sum_i c_fi a_iof the 134 stage-one adapters, with the coefficients taken from the jobs actually steered in phase 10,qwen35/phase10_runs/steer_spec2_7a.json(FA_Warmth,FA_Competence,FA_FearfulWithdrawal,FA_Arousal,FA_Imagination). - The order is fixed at descending oblimin sum of squared loadings - 10.76, 8.42, 7.02, 6.81, 5.80 - because Gram-Schmidt is not order-invariant.
- Inner products come from the exact Gram
results/gram_sweep.npz, and the chart basis is the Gram-Schmidt orthonormalisation of the five directions in that metric,B G B^T = I. A coordinate isx = B G cfor a merge,B X[:, b]for an external adapter given its cross-Gram column. - The five directions themselves are oblique. Pairwise cosines
(
qwen35/analysis/fa_chart_summary.json#factor_pairwise_cosines): Warmth against Competence -0.2439, against Timidity -0.6661, against Arousal 0.0138, against Imagination 0.4302; Competence against Timidity -0.0271, against Arousal -0.728, against Imagination -0.086; Timidity against Arousal 0.2571, against Imagination -0.3525; Arousal against Imagination 0.1958. The two strongly oblique pairs are Competence/Arousal at -0.728 and Warmth/Timidity at -0.6661. - The chart captures a mean fraction 0.5784887830866848 of an adapter's norm
- trait chart length mean 0.9369798382181508 against adapter norm mean
1.6157416444226869 (
qwen35/analysis/fa_chart_summary.json). Fifty-eight per cent of an adapter is inside the chart and forty-two per cent is not.
Does any of this depend on the metric?
The Gram factored here is a Frobenius inner product, which is a choice the model
has no opinion about. The factor analysis in the model's own metric rebuilds the same 134 x
134 matrix as a Fisher inner product - the curvature of the output distribution
- and reruns this script on it unchanged. The five factors come back: the two
134 x 5 oblimin loading matrices match column for column at Tucker congruence
0.965359016717984, minimum 0.954900651340028, all five above the 0.95
"identical" threshold
(qwen35/analysis/fa_fisher_metric.json#loading_matrix_congruence_k5.pairs.frobenius_vs_fisher_expected).
Parallel analysis still retains nine, and the Big Five congruences move by at
most 0.0589 - Agreeableness 0.6555 to 0.5966, Conscientiousness 0.5744 to
0.5913, Emotional Stability 0.4049 to 0.4106, Extraversion 0.5389 to 0.5389,
Intellect 0.6823 to 0.6876 (#arms.*.k5.one_to_one_matching). The one thing
that does change is the ordering: Imagination rises from fifth to third by sum
of squared oblimin loadings and Timidity falls from third to fifth.
So the congruence ceiling below is not an artefact of the metric, and neither is
the five-factor structure.
Per-trait coordinates for all 134 are in qwen35/analysis/viz_fa.json, written by
qwen35/build_viz_data_fa.py, and appear on every trait page under "Where it sits
in weight space".
Related: The factor analysis in the model's own metric, The factor chart, Factor-first migration, PCA, the scree curve and the two nulls, Weight-space geometry of the 134-adapter zoo, Polarity, bipolarity and the trait graph, History of the Big Five, Steering the base model along weight-space directions, Factor analysis of the null arms, Per-direction seed stability, and why the check is uninformative, What has been done to the PCs but not to the factors, Glossary.
The factors in the training gradients, before training (added 2026-09-10)
Gradient atoms on the zoo's own preference data asks whether the five factors are present in the zoo's DPO
preference gradients at B = 0, before any adapter exists, by porting Rosser's
Gradient Atoms pipeline (arXiv:2603.14665) to this corpus: per-pair gradients
with respect to LoRA-B, EKFAC-projected to 6,944 dimensions, and 200 sparse atoms
learned with no labels. Four of the five factor directions have a nearest atom
above the widest of twenty random merges in weight space - FA_Warmth
0.2579, FA_FearfulWithdrawal 0.2386, FA_Competence 0.2288, FA_Arousal 0.2136
against a widest random merge of 0.1734; FA_Imagination at 0.1602 does not
(analysis/gradient_atoms.json#atom_space.directions). Atom purity against each
trait's dominant oblimin loading from
results/fa_qwen35.json#solutions.centred_k5.loadings.oblimin is 0.4730
against a label-shuffle null of 0.3479 (z 25.5436), higher than purity against
the corpus's own factor field (0.3781, z 13.4247) - the unlabelled
decomposition agrees better with the factor solution this page recovered than
with the labels the corpus was built from.
See Factor analysis of the training-contrast embeddings: the same five factors, with the same rotation, come out of the training-contrast embeddings alone (Tucker 0.81 to 0.97).
The 2026-10-30 post on the number of factors
The post (Post: Persona Geology (2026-10-30)) argues for five as the conservative end of the
parallel-analysis grid: 5 at N = 150, 9 at N = 1,528, 14 at N = 20,000
(qwen35/results/fa_qwen35.json#n_factors.parallel_analysis_centred.grid[*].k_unreduced_95pct),
with the shuffled zoo reaching 10 at N = 20,000
(qwen35/analysis/fa_nulls.json#arms.shuffled.parallel_analysis_grid.centred).
It says the first five components carry 34% and components 6 to 9 another 6%; the
file's first five #pca_from_gram.centered_var_pct entries sum to 34.6458... and
the next four to 6.1424.... It also says a nine-factor solution contains the same
five at congruence 0.80 to 0.94 plus four factors reading as Vigor, Moodiness,
Reflectiveness and Envy. No file stores that congruence, and the k = 9 factors are
unnamed in qwen35/analysis/fa_summary.json#centred_k9; recorded as
Source contradictions S31.
Sources
wiki/raw/post-persona-geology-2026-10-30.mdqwen35/results/fa_qwen35.mdqwen35/results/fa_qwen35.jsonqwen35/analysis/fa_summary.jsonqwen35/analyse_fa_qwen35.pyqwen35/analysis/qual_fa.jsonqwen35/analysis/qual_fa_notes.mdqwen35/build_blog_page.pyqwen35/fa_chart.pyqwen35/analysis/fa_chart_summary.jsonqwen35/analysis/viz_fa.jsonqwen35/analysis/fa_nulls.jsonqwen35/results/fa_qwen35_null_shuffled.jsonqwen35/results/fa_qwen35_null_permuted.jsonqwen35/analysis/direction_seed_stability.jsonqwen35/analysis/fa_fisher_metric.json
Linked from
- The activation-weighted Gram, and what the seed floor looks like in it
- Best axis pair per Goldberg group
- History of the Big Five
- Big Five factor adapters (Persona Cartography's own ten dials)
- Claims and evidence
- Code and data map
- Per-direction seed stability, and why the check is uninformative
- The factor analysis in the model's own metric
- Factor analysis of the null arms
- FA_Arousal (Arousal / activation)
- Factor audit, 2026-09-11
- axis_Extraversion (the named Extraversion axis)
- The factor chart
- FA_Competence (Competence)
- FA_FearfulWithdrawal (Timidity)
- Factor-first migration
- FA_Imagination (Imagination)
- FA_Warmth (Warmth / prosociality)
- What has been done to the PCs but not to the factors
- Fisher norms of the steering directions
- Weight-space geometry of the 134-adapter zoo
- Glossary
- Goldberg-only factoring and the 34 as a held-out set
- Gradient atoms on the zoo's own preference data
- Persona Geology wiki
- Inspect personality evaluations (BFI and TRAIT)
- Notes from Claude, for the agents who come next
- Open questions
- Paper reading, 2026-09-09 - SliderSpace and Gradient Atoms
- PCA, the scree curve and the two nulls
- Polarity, bipolarity and the trait graph
- Post: Persona Geology (2026-10-30)
- Source contradictions
- The sphere sweep on the factor chart
- Start here for collaborators
- Superseded claims
- Factor analysis of the training-contrast embeddings
- Trait provenance