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.

currentverified 2026-09-10

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:

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.

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

PCA elbow: eigenvalues of the centred trait correlation matrix 1 2 4 8 16 1 3 5 7 9 11 13 15 17 19 component eigenvalue (log scale) stage one (DPO), 134 traits stage two (introspection SFT), 134 traits random-data null, 95th percentile, N = 150 random-data null, 95th percentile, N = 1528 permuted null arm, 100 traits shuffled null arm, 100 traits
PAF elbow: eigenvalues of the reduced correlation matrix (SMC diagonal) 1 2 4 8 16 1 3 5 7 9 11 13 15 17 19 component reduced eigenvalue (log scale) stage one (DPO), 134 traits stage two (introspection SFT), 134 traits random-data null, 95th percentile, N = 150 random-data null, 95th percentile, N = 1528 permuted null arm, 100 traits shuffled null arm, 100 traits

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:

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.md
  • qwen35/results/fa_qwen35.md
  • qwen35/results/fa_qwen35.json
  • qwen35/analysis/fa_summary.json
  • qwen35/analyse_fa_qwen35.py
  • qwen35/analysis/qual_fa.json
  • qwen35/analysis/qual_fa_notes.md
  • qwen35/build_blog_page.py
  • qwen35/fa_chart.py
  • qwen35/analysis/fa_chart_summary.json
  • qwen35/analysis/viz_fa.json
  • qwen35/analysis/fa_nulls.json
  • qwen35/results/fa_qwen35_null_shuffled.json
  • qwen35/results/fa_qwen35_null_permuted.json
  • qwen35/analysis/direction_seed_stability.json
  • qwen35/analysis/fa_fisher_metric.json

Linked from