Why scale blocks before concatenating?
A joint analysis of several omics blocks needs a way to put them into one matrix while accounting for differences in their overall scale. A block with many variables, large numerical units, or strong variation along one direction can otherwise have a large influence on the PCA of the concatenated data. Multiple factor analysis (MFA) addresses this at the block level: it first computes each block’s leading PCA eigenvalue, then divides the whole block by the square root of that eigenvalue before concatenation.
The operation is specific: it rescales every column in a block by the same factor. It does not replace variable-level preprocessing. For quantitative MFA, columns are commonly centered and standardized within each block before the PCA eigenvalues are calculated. The eigenvalue used for scaling must correspond to the data matrix that will actually be scaled.
The factor is the inverse square root, not the inverse eigenvalue. Because a covariance matrix is quadratic in the entries of \(X_k\), multiplying the data matrix by \(1/\sqrt{\lambda_{1k}}\) divides its covariance eigenvalues by \(\lambda_{1k}\). This convention uses \(1/n\); if software defines PCA eigenvalues using \(1/(n-1)\), its numerical eigenvalues and scaling factors will differ. Use one convention consistently for every block.
Assumptions and construction
Before calculating the factors, check that the blocks refer to the same individuals in the same row order, that each block has been preprocessed as intended, and that each block has at least one nonconstant direction. Centering means each column has mean zero across individuals. A zero first eigenvalue means the entire centered block has no variation, so its scaling factor is undefined; remove or otherwise address such a block rather than attempting to divide by zero.
For a quantitative block whose columns are standardized, the eigenvalue is calculated from that standardized matrix. If variables have instead been retained in their original units, the eigenvalue reflects those units and the resulting scaling reflects them too. The block-scaling step does not decide which preprocessing is scientifically appropriate.
Align rows to the same individuals, then apply the chosen centering and variable-level scaling. Record the exact matrix used for PCA.
Calculate the largest eigenvalue \(\lambda_{1k}\) of \(X_k^\top X_k/n\) for every block.
Divide every entry in block \(k\) by \(\sqrt{\lambda_{1k}}\), then place the scaled blocks side by side in the chosen block order.
Worked calculations
Worked Example: Scaling a Single Block
Suppose three hypothetical individuals have the centered, two-variable block \(X=\begin{bmatrix}1&0\\-1&0\\0&0\end{bmatrix}\). Using the \(1/n\) covariance convention, its covariance matrix is
The eigenvalues are \(2/3\) and \(0\), so the first principal inertia is \(\lambda_1=2/3\). The scaling factor is \(1/\sqrt{2/3}=\sqrt{3/2}\approx1.225\). Therefore
As a check, the leading eigenvalue of \(X^{\ast\top}X^\ast/3\) is \((3/2)(2/3)=1\). The second direction remains zero; block scaling does not create variation that was absent.
Worked Example: Constructing a Two-Block Weighted Matrix
Consider three hypothetical individuals and two centered blocks. Let \(a=(1,-1,0)^\top\) and \(b=(1,1,-2)^\top\), and define \(X_1=[a\;\;2a]\) and \(X_2=[b]\). The two blocks have the same three rows, but different numbers of variables.
For the first block, \(a^\top a=2\), so
The matrix inside has eigenvalues \(10\) and \(0\); hence \(\lambda_{11}=10/3\). For the second block, \(b^\top b=6\), giving \(X_2^\top X_2/3=[2]\), so \(\lambda_{12}=2\). The scaling factors are \(\sqrt{3/10}\approx0.5477\) and \(1/\sqrt{2}\approx0.7071\).
The weighted concatenation has three columns, with the first two from \(X_1\) and the third from \(X_2\):
For example, the first row of the first block is \(1\) times \(0.5477\) in column one and \(2\) times \(0.5477\) in column two; the second block’s first entry is \(1\) times \(0.7071\). The corresponding leading covariance eigenvalue of each separately scaled block is \(1\), by the calculation in the next section.
Why the square-root factor is used
The scaling has a direct eigenvalue justification. For any positive constant \(c\), the covariance matrix of \(cX_k\) is \(c^2X_k^\top X_k/n\). Thus all its eigenvalues are multiplied by \(c^2\). Setting \(c=1/\sqrt{\lambda_{1k}}\) gives
The eigenvectors are unchanged, and every eigenvalue is divided by \(\lambda_{1k}\). In particular, the largest eigenvalue of the scaled block is \(\lambda_{1k}/\lambda_{1k}=1\). This is the defining calculation behind first-principal-inertia scaling.
Worked Example: Checking the Scaling and Its Dependence on Units
Return to \(a=(1,-1,0)^\top\) and \(b=(1,1,-2)^\top\). The block \(C=[a\;\;b]\) has orthogonal columns, and
Its first eigenvalue is \(2\), so \(C^\ast=C/\sqrt{2}\). Now express the same block in units three times as large: \(D=3C\). Then \(D^\top D/3=9C^\top C/3\), and its first eigenvalue is \(18\). Scaling gives
Thus a common positive change of units for the entire block cancels in the scaling factor. This calculation does not mean that arbitrary variable-by-variable changes or different preprocessing choices cancel; those can change the block’s PCA and its scaled matrix.
Diagnostics, alternatives, and limitations
Several simple checks can catch construction errors. Confirm that every scaled block still has \(n\) rows, that its columns remain in their original order, and that the largest eigenvalue of \(X_k^{\ast\top}X_k^\ast/n\) is approximately \(1\). Small numerical differences are expected from rounding; a result far from \(1\) often signals that the wrong eigenvalue, scaling factor, or covariance convention was used. Also check for non-finite entries, zero-variance columns, and duplicated or misordered individuals before interpreting a joint analysis.
The main alternative at this construction stage is to concatenate the preprocessed blocks without block-level scaling. That leaves the block PCA eigenvalues unchanged and may make the scale of a block consequential in the joint PCA. Another possible choice is to normalize a block by its total inertia, the sum of all its eigenvalues. That is a different weighting rule: it targets total variation rather than the leading eigenvalue. These alternatives answer different design questions, so the choice should be reported rather than hidden in preprocessing.
First-eigenvalue scaling sets each block’s largest individual eigenvalue to one; it does not set every block’s total inertia to one, nor guarantee that all blocks contribute equally to every direction of a later joint analysis. Those are distinct properties. A block may have a different number of variables or a different distribution of variation across its directions even after the leading eigenvalue has been normalized.
A common mistake is to divide \(X_k\) by \(\lambda_{1k}\) and reason that this makes its first eigenvalue one. In fact, this divides covariance eigenvalues by \(\lambda_{1k}^2\), because covariance scales quadratically: \((X_k/\lambda_{1k})^\top(X_k/\lambda_{1k})/n=(X_k^\top X_k/n)/\lambda_{1k}^2\). The correction is to divide the data matrix by \(\sqrt{\lambda_{1k}}\). Another mistake is to calculate eigenvalues before the chosen variable-level standardization and then scale a differently preprocessed matrix. The eigenvalue and matrix being scaled must refer to the same preprocessing pipeline.
Check Your Understanding
Answer each question, then compare with the solutions below.
- A block has first eigenvalue \(4\). What is its scaling factor, and what is the first eigenvalue after scaling?
- Why is dividing the data matrix by \(\lambda_{1k}\) generally not the correct scaling?
- Two blocks contain the same individuals but are ordered differently by row. Can they be concatenated directly? Explain.
- A centered block has all eigenvalues zero. What prevents the usual scaling, and what should be checked?
Solutions. (1) The factor is \(1/\sqrt{4}=0.5\). Covariance eigenvalues are divided by \(0.5^{-2}=4\), so the first becomes \(4/4=1\). (2) Dividing the data by \(\lambda_{1k}\) divides covariance eigenvalues by \(\lambda_{1k}^2\), not by \(\lambda_{1k}\); use \(1/\sqrt{\lambda_{1k}}\). (3) No. Rows must refer to the same individuals in the same order, or the resulting joint observations would pair measurements from different individuals. (4) The required factor divides by zero. Check whether the block is constant after centering, whether it was read or preprocessed incorrectly, and whether it should be excluded or handled separately.