epxCNS Copy-Number Variation (CNV)
Methods
This note describes how epxCNS computes genome-wide copy-number profiles from Illumina Infinium DNA-methylation arrays. The method follows conumee and conumee2 (Hovestadt and Zapatka 2015; Daenekas et al. 2024). It has three steps. First, epxCNS compares the combined intensity of each probe against a panel of reference samples that have no copy-number changes. Second, it groups the resulting log2 ratios into genomic bins. Third, it divides the binned profile into segments by circular binary segmentation. This note describes the principle of the method, the data objects, the bin annotation, the reference panels, and the segmentation parameters. It then describes how to read the log2 ratios, including the effects of specimen composition and of array resolution.
1 Introduction
epxCNS computes genome-wide copy-number profiles from Illumina Infinium DNA-methylation arrays. It supports the 450K, EPIC v1.0, and EPIC v2.0 arrays. The method follows conumee and conumee2 (Hovestadt and Zapatka 2015; Daenekas et al. 2024). Section 1.3 gives the detail.
The input is the pair of raw IDAT files of one sample. The output is a log2 ratio for each genomic bin, and a set of segments of constant copy number. epxCNS computes one profile for one sample, and it does not compare samples with each other.
1.1 The principle
Each Infinium probe measures two signals for its target locus. One signal is the intensity of the methylated allele, \(M\). The other is the intensity of the unmethylated allele, \(U\). The methylation level of the locus is the ratio \(M/(M+U)\).
The sum \(M+U\) gives different information. It shows the total quantity of sample DNA that hybridised at that locus. To a first approximation, the sum does not depend on the methylation level of the locus. The sum is therefore a dosage signal. It increases where the genome gained copies. It decreases where the genome lost copies.
You cannot compare this signal between probes. The absolute intensity of a probe depends on its sequence, on its GC content, and on its Infinium design type. These probe-specific effects are much larger than the two-fold changes that a copy-number event makes. But you can compare the signal for the same probe between samples. The method uses this fact. epxCNS compares each probe of the query sample against the same probe in a panel of reference samples that have no copy-number changes. The ratio of the two values contains the copy-number information. Query and reference share the probe-specific effects, and the ratio removes them.
Two results follow, and both are important for interpretation. First, the result is a relative measure. It finds gains and losses against a reference and against the remainder of the genome. It does not give absolute copy number (Section 6). Second, one probe is a poor measure of dosage, because the scatter of one probe is as large as the effect to measure. epxCNS therefore groups probes into genomic bins (Section 4). It then divides the binned profile into segments of constant copy number (Section 5).
1.2 What the method can and cannot detect
The method measures the quantity of DNA at each locus. It therefore finds only those changes that alter that quantity. It detects gains and losses of genomic material.
Three kinds of change give no signal, because they do not alter the quantity of DNA at a locus:
- a balanced rearrangement, such as an inversion or a balanced translocation;
- copy-neutral loss of heterozygosity;
- a change of ploidy that affects the whole genome equally.
The method also gives relative values and not absolute copy numbers. Section 6 describes what the values mean.
1.3 Origin of the method
Feber et al. showed that you can find copy-number changes with methylation arrays (Feber et al. 2014). They compared array profiles against SNP arrays. conumee introduced the method used here (Hovestadt and Zapatka 2015), and conumee2 revised it (Daenekas et al. 2024). Together they established the reference-based normalization, the binning scheme, and the use of circular binary segmentation. The segmentation uses the algorithm of Olshen et al. (Olshen et al. 2004) in the faster form of Venkatraman and Olshen (Venkatraman and Olshen 2007). The DNAcopy package implements that algorithm. epxCNS implements this method. The sections that follow describe each step.
2 Workflow and data objects
The analysis uses two kinds of input. The first is the IDAT files of the sample. The second is a set of data objects that epxCNS supplies. Those objects do not change. Figure 1 shows which object each step uses.
epxCNS uses them. The left column shows what epxCNS computes for the sample. The right column shows the objects that epxCNS supplies. Each object is level with the step that uses it. epxCNS selects the reference panel automatically by array type and by predicted sex. It determines both from the methylation data of the sample.
The steps are:
- Read the Green and Red channel intensities. Compute the methylated (\(M\)) and unmethylated (\(U\)) intensity of each probe. Use the manifest of the array type that
epxCNSdetected. - Compute the copy-number signal as the combined intensity \(I = M + U\) for each probe.
- Fit the query intensities against the matched reference panel. Take the residual as the per-probe log2 ratio (Section 3).
- Group the probe ratios into the genomic bins of the bin annotation. Centre the profile (Section 4).
- Divide the binned profile into segments by circular binary segmentation (Section 5).
epxCNS uses the probe intensities directly for copy-number calling. It does not apply background correction, dye-bias correction, or batch correction to them. The reference fit in step 3 removes the technical variation that query and reference have in common.
epxCNS returns these components for each sample.
| Component | Content |
|---|---|
| Probe ratios | The per-probe log2 ratio \(R_i\), for every probe of the array annotation |
| Noise | The per-sample noise metric (Section 3.4) |
| Bin medians | The median probe ratio for each genomic bin. epxCNS segments these values |
| Baseline shift | The median probe ratio over the whole genome. epxCNS subtracts it to centre the profile |
| Detail-region medians | The median probe ratio in each of the 29 predefined regions of interest |
| Segments | Start, end, number of bins, and mean log2 ratio for every segment |
| Sample attributes | Sentrix identifier, array type, predicted sex, and material type of the sample |
| Annotation | The bin annotation and the detail regions that the analysis used |
3 Tangent normalization
This step takes its name from the Tangent method. Gao et al. developed Tangent for copy-number analysis in The Cancer Genome Atlas (Gao et al. 2022). Tangent represents the systematic error of a sample as a linear combination of normal samples, then subtracts that combination. It does not compare the sample against an average of controls. conumee applied this idea to methylation arrays (Hovestadt and Zapatka 2015; Daenekas et al. 2024). epxCNS uses the same approach.
3.1 Copy-number signal
For each probe \(i\), the copy-number signal is the sum of the methylated and unmethylated intensities.
\[ I_i = M_i + U_i . \]
epxCNS sets values of zero or less to 1 before it computes logarithms.
3.2 Reference panels
epxCNS normalises the query against a panel of reference samples that have no copy-number changes. It supplies six panels: one panel for each of the three array types and the two sexes. It selects the correct panel automatically. It detects the array type from the probe content of the IDAT files. It predicts the sex from the methylation data of the sample. A panel holds only the combined intensities \(I\) of its control samples at each probe of the array. It does not hold sample identifiers.
Table 2 shows the composition of each panel. The 450K and EPIC v1.0 panels are the conumee reference cohorts (Hovestadt and Zapatka 2015). The EPIC v2.0 panels come from the public GEO series GSE246337 (Moqri et al. 2026). That series holds 500 whole-blood samples from the Biomarkers of Aging Consortium cohort on the EPIC v2.0 array. The series divides into 241 male and 259 female samples. epxCNS took 100 samples of each sex with a fixed random seed. The panel is therefore reproducible.
| Array | Probes in panel | Male controls | Female controls | Source cohort |
|---|---|---|---|---|
| 450K | 485,577 | 50 | 50 | conumee CNanalysis4 (2015) |
| EPIC v1.0 | 865,859 | 50 | 50 | conumee CNanalysis6 (2018) |
| EPIC v2.0 | 929,772 | 100 | 100 | GSE246337, whole blood |
The EPIC v2.0 reference is therefore whole blood. It is not control central nervous system tissue. We nevertheless find that it works well as a copy-number reference. The panel does not need to represent the biology of the query. Its function is to characterise the behaviour of each probe. It must also contain the same technical variation as the query, so that the fit can remove that variation. The panel must match the array and the expected sex-chromosome copy number. It does not need to match anything else. The copy-number signal is the summed intensity \(I = M + U\). As Section 1 describes, this sum is largely independent of the methylation state of the locus. The difference between blood and brain is very largely a difference in methylation state. It therefore has little effect on the quantity that the normalization uses.
Two properties of this arrangement are important. epxCNS supplies the panels, so you do not need to find or assemble a control set before an analysis. epxCNS also normalises every sample of a given array type and sex against the same controls. Results are therefore reproducible from run to run. The panels are sex-matched. Chromosomes X and Y therefore get the same treatment as the autosomes. The query and its reference have the same expected sex-chromosome copy number. epxCNS therefore does not report the loss of one X chromosome in a male sample.
3.3 The fit and the log2 ratio
The reference samples have the same technical variation as the query. They have no copy-number changes. epxCNS approximates the technical variation of the query as a linear combination of those reference samples. It fits the combination in log2 space over the reference samples \(c\) of the matched panel.
\[ \log_2 I_i^{q} = \beta_0 + \sum_{c} \beta_c \log_2 I_i^{c} + \varepsilon_i , \]
The fit gives a fitted reference intensity \(\hat{I}_i\) for each probe. The copy-number log2 ratio is the ratio of the observed intensity to the fitted reference intensity.
\[ R_i = \log_2 \!\left( \frac{I_i^{q}}{\hat{I}_i} \right) = \log_2 I_i^{q} - \log_2 \hat{I}_i , \]
This ratio is the residual of the fit. epxCNS removes a reference sample from the fit if its intensities correlate with the query at 0.99 or more. This step prevents epxCNS from normalising a sample against itself when that sample is part of the panel.
Figure 2 shows the result for the example specimen. Each point is one probe. The horizontal position is the fitted reference intensity, and the vertical position is the observed intensity. A probe with the same copy number as the reference falls on the identity line. Its vertical distance from that line is \(R_i\). Most probes are close to the line, because the fit removed the technical variation. The distances from the line are the copy-number signal. The later steps group and segment that signal.
epxCNS equivalent of Figure 2c of Daenekas et al. (Daenekas et al. 2024). We transposed the axes, so the vertical offset is \(R\) and not \(-R\).
3.4 Per-sample noise
epxCNS summarises the scatter of the profile as the root mean square of the differences between neighbouring probe ratios.
\[ \mathrm{noise} = \sqrt{ \overline{ \left( R_{i+1} - R_i \right)^2 } } . \]
The value uses differences between adjacent probes. It therefore measures point-to-point scatter. It does not measure true copy-number structure. That structure changes on a much longer scale. The value increases with degraded material and with low-input material. It is therefore a measure of sample quality. conumee2 recommends that you exclude samples with a noise value above 0.6 (Daenekas et al. 2024).
4 Genomic bins and the bin annotation
4.1 What the bins have to achieve
One probe is too noisy to report copy number. epxCNS therefore groups probes into genomic bins. Bins of a fixed width do not work, because Infinium probes are not evenly distributed. Probe coverage is dense at CpG islands and gene promoters. It is sparse between genes. Bins of a fixed width would therefore hold hundreds of probes in some places and no probes in others. epxCNS builds each bin to hold a minimum number of probes instead of a fixed distance. The width of the bin is therefore the quantity that changes. The width increases as the local probe density decreases.
4.2 How the bin annotation is built
epxCNS builds the bin annotation one time for each array type and supplies the result. Every sample of a given array therefore gets the same bins. The build has seven steps.
- Define the genome. Use chromosomes 1 to 22, X, and Y. Take the chromosome lengths from the UCSC assembly. Use hg19 for 450K and EPIC v1.0. Use hg38 for EPIC v2.0.
- Tile. Divide each chromosome into 50 kb windows. Cut the last window of each chromosome at the end of the chromosome.
- Remove assembly gaps. Subtract the UCSC gap track. That track covers centromeres, telomeres, heterochromatic regions, and unbridged clone gaps. Trim a window that overlaps a gap, and do not discard it. Windows narrower than 50 kb therefore occur at the edges of gaps. A window that spans a gap divides into two windows.
- Count probes. Count the array probes in each window.
- Merge windows until each bin holds 15 probes or more. Take the window with the fewest probes. Merge it into its left or right neighbour, whichever neighbour holds fewer probes. Merge only into a neighbour that is directly adjacent. A neighbour on the other side of an assembly gap does not qualify, so no bin spans a gap. The merged bin covers both windows, and its probe count is the sum of the two counts. If a window has no adjacent neighbour, remove that window. Merge only inside one chromosome, so no bin crosses a chromosome boundary. Stop when each bin holds 15 probes or more.
- Remove bins that are too wide. Remove each bin wider than 5 Mb. These bins occur in the regions with the fewest probes. In those regions a bin must cover many megabases to reach 15 probes. Their removal prevents one bin from representing a region much larger than the array can resolve.
- Finish. Count the probes of each remaining bin again. Record the midpoint of each bin. The bin uses that coordinate in segmentation. Number the bins in order along each chromosome. Add to each bin the gene symbols of the probes in it.
conumee and conumee2 established the parameters of this procedure (Hovestadt and Zapatka 2015; Daenekas et al. 2024). The parameters are:
- a tile of 50 kb;
- a minimum of 15 probes for each bin;
- a maximum bin width of 5 Mb.
Figure 3 shows the procedure on a real part of the 450K annotation that epxCNS supplies.
epxCNS groups probes into bins. The figure uses chr10:82.1-83.6 Mb of the 450K annotation. Each probe position, tile boundary, bin boundary and probe count comes from the annotation that epxCNS supplies. Read the figure downward. The first row shows the 1.5 Mb window on chromosome 10. The second row shows the 119 array probes in that window, and each dot is one probe. The probes are dense on the left and sparse on the right. The third row shows the 30 tiles of 50 kb in the window. The fourth row shows the six bins that result. The four tiles on the left already hold enough probes and become bins without a change. The next two tiles merge into a bin of 100 kb. The probes are sparse in the remainder of the window. There, 24 tiles merge into one bin of 1.2 Mb. That bin holds exactly 15 probes. Each bin holds a similar number of probes, between 15 and 27. The width of the bin therefore changes with the probe density. The widest bin in this window is 24 times the narrowest bin.
4.3 The resulting bins
Table 3 shows the bins for each array. The median bin width is exactly 50 kb on all three arrays. A bin of 50 kb is one tile that epxCNS did not merge. The mean width is larger than the median, because a minority of bins in the regions with few probes are much wider. The widest bins reach the limit of 5 Mb.
epxCNS supplies.
| Array | Genome build | Bins | Median probes per bin | Median width | Mean width | 95th pct width | At exactly 50 kb |
|---|---|---|---|---|---|---|---|
| 450K | hg19 | 16,285 | 25 | 50 kb | 174 kb | 600 kb | 49.9 % |
| EPIC v1.0 | hg19 | 26,470 | 28 | 50 kb | 107 kb | 307 kb | 62.1 % |
| EPIC v2.0 | hg38 | 27,872 | 28 | 50 kb | 102 kb | 300 kb | 64.2 % |
The median is the same on all three arrays because a merge always adds one complete tile. Bin widths are therefore multiples of 50 kb, and 50 kb is the commonest width on each array. The last column gives the exact proportion. Fewer than 0.25 % of bins are narrower than 50 kb, and an assembly gap trimmed each of those.
epxCNS reports bin coordinates and segment coordinates in the genome build of the array annotation. Table 3 lists the build for each array. Use the correct build when you compare coordinates.
4.4 Aggregation and centring
The value of a bin is the median of the log2 ratios of the probes in it.
\[ \bar{R}_b = \operatorname{median}_{\, i \in b} R_i . \]
epxCNS uses the median and not the mean, so that one aberrant probe cannot move the bin. epxCNS also records the dispersion of the probe ratios in each bin as their median absolute deviation. It uses that value to weight the segmentation (Section 5).
epxCNS then centres the profile. It subtracts the median of the probe-level ratios. That subtraction puts the copy-number-neutral state of the sample at zero. The profile is therefore relative to the genome-wide baseline of the sample. Section 6 discusses this result.
epxCNS applies the same aggregation to 29 predefined regions of interest. These regions cover genes whose copy-number status is important for diagnosis. epxCNS reports one median probe ratio for each region. These detail regions do not depend on the bin boundaries.
epxCNS supplies.
5 Circular binary segmentation
Binning reduces the scatter of the profile, but it gives one value for each bin. A copy-number event covers many adjacent bins. Segmentation finds those blocks. It divides the ordered sequence of bin values into segments, and the copy number is constant inside each segment. epxCNS reports one mean log2 ratio for each segment.
epxCNS uses circular binary segmentation (Olshen et al. 2004; Venkatraman and Olshen 2007), as the DNAcopy package implements it. The algorithm works recursively. For a given part of the sequence, the algorithm examines every division of that part into two or three pieces. It selects the division with the largest standardised difference in means. It then tests that division against a distribution that it makes by permutation of the bin values in that part. If the division passes the test at the given significance level, the algorithm divides the part and repeats on each piece. If the division does not pass, the part becomes one segment. The test uses a permutation distribution and not an analytic null distribution. This makes the algorithm robust against scatter that is not normally distributed and that has many extreme values. Array data show that kind of scatter. epxCNS segments each chromosome separately, so no segment crosses a chromosome boundary.
Each bin enters the segmentation at its midpoint. Each bin also has a weight. That weight is the inverse of the median absolute deviation of the probe ratios in that bin.
Table 4 shows the parameters.
| Parameter | Value | Meaning |
|---|---|---|
alpha |
0.001 |
significance threshold for accepting a change point |
nperm |
50000 |
permutations used for the reference distribution |
min.width |
5 |
minimum segment width, in bins |
undo.splits |
"sdundo" |
epxCNS merges two adjacent segments if too few standard deviations separate their means |
undo.SD |
2.2 |
number of standard deviations used by that merge step |
Two parameters change the output more than the others. alpha = 0.001 is a strict threshold. A change point must therefore have strong support before the algorithm divides the profile. This favours specificity above sensitivity. The sdundo step then merges adjacent segments again if their means differ by 2.2 standard deviations of the residual scatter or less. That step prevents the division of one true segment into several segments at slightly different levels. min.width = 5 counts bins and not base pairs. It sets the resolution limit that Section 6.4 discusses.
Each segment has a start position, an end position, the number of bins in it, and a mean log2 ratio. The mean log2 ratio describes the copy-number state of that region.
5.1 The segment table
get_cnv() returns two segment tables, and both are fields of the result object. cnv$seg_summary holds the first table. cnv$seg_p holds the second. Section 7 shows how to read them out.
Table 5 shows cnv$seg_summary for the example specimen of Figure 4 and Figure 5. It shows chromosome 1 only. The full table for this sample has 59 segments across the 24 chromosomes.
epxCNS returns them. The coordinates have no formatting, as they appear in the output.
| ID | chrom | loc.start | loc.end | num.mark | seg.mean | seg.sd | seg.median | seg.mad |
|---|---|---|---|---|---|---|---|---|
| sampleid | chr1 | 635684 | 4072634 | 61 | −0.0011 | 0.0399 | −0.0065 | 0.0348 |
| sampleid | chr1 | 4175000 | 5850000 | 11 | 0.1089 | 0.0587 | 0.1545 | 0.0226 |
| sampleid | chr1 | 5925000 | 93150000 | 680 | 0.0136 | 0.0506 | 0.0124 | 0.0508 |
| sampleid | chr1 | 93400000 | 116525000 | 119 | −0.1403 | 0.0561 | −0.1400 | 0.0499 |
| sampleid | chr1 | 116675000 | 249195311 | 722 | 0.0360 | 0.0623 | 0.0331 | 0.0520 |
cnv$seg_p is the second table, over the same segments. It adds the statistics of the change point at the end of each segment. Its first six columns repeat the columns above. Table 6 shows it for the same five segments.
ID column. It holds the same value in each row as the ID column in Table 5. This table omits that column, so that the change-point columns have more space. The p-values have three significant figures. The last row is the final segment of the chromosome. That segment has no change point at its end, so it has no change-point statistics.
| chrom | loc.start | loc.end | num.mark | seg.mean | bstat | pval | lcl | ucl |
|---|---|---|---|---|---|---|---|---|
| chr1 | 635684 | 4072634 | 61 | −0.0011 | 8.2702 | 7.05e−15 | 3775000 | 4475000 |
| chr1 | 4175000 | 5850000 | 11 | 0.1089 | 7.7782 | 1.12e−12 | 5200000 | 6075000 |
| chr1 | 5925000 | 93150000 | 680 | 0.0136 | 30.6433 | 2.06e−203 | 92975000 | 93400000 |
| chr1 | 93400000 | 116525000 | 119 | −0.1403 | 29.6791 | 9.23e−191 | 116375000 | 116675000 |
| chr1 | 116675000 | 249195311 | 722 | 0.0360 |
The two tables together hold every column that the result returns. Table 7 gives the meaning of each column.
| Column | Meaning |
|---|---|
ID |
A fixed label from the segmentation call. It holds the same string for every sample and does not identify the specimen. The result holds the sentrix identifier and the array type separately (Table 1) |
chrom |
Chromosome of the segment |
loc.start |
Position of the first bin of the segment, given as the midpoint of that bin |
loc.end |
Position of the last bin of the segment, given as the midpoint of that bin |
num.mark |
The number of bins in the segment. These are bins and not probes. The count is never less than min.width, so 5 is the smallest possible value |
seg.mean |
The mean of the bin log2 ratios in the segment. This value describes the copy-number state of the region |
seg.sd |
The standard deviation of the bin log2 ratios in the segment |
seg.median |
The median of the bin log2 ratios. It differs from seg.mean if the bin values in the segment are asymmetric. It also differs if the segment holds outlying bins, as in the second row above |
seg.mad |
The median absolute deviation of the same values, a robust counterpart to seg.sd |
bstat |
Test statistic for the change point at the end of the segment |
pval |
Permutation p-value for that change point |
lcl, ucl |
The lower and upper confidence limits for the position of that change point, in base pairs. In the first row above the change point is at 4,072,634, with limits of 3,775,000 and 4,475,000 |
Four points follow from these tables.
num.markcounts bins and not probes. A segment of 11 bins can cover approximately 550 kb, or many megabases. The extent depends on the position (Table 9). Take the genomic extent from the coordinates. Do not compute it from the bin count.- The coordinates are bin midpoints, so they give a smaller extent than the true one. A segment starts at the start edge of its first bin and ends at the end edge of its last bin. Each end is therefore half a bin further out than the coordinate shows. On this sample the quoted extent is approximately 1 % smaller than the extent of the bins on average. For the shortest segments it is up to 25 % smaller. In the first row above,
loc.startis 635,684, but the first bin starts at 521,369. The difference is 114 kb. This is important if you compute a minimum reportable size from these columns. - The rows are in lexicographic order of chromosome name.
chr10therefore followschr1and notchr9. Sort the rows numerically if you need genomic order. - The last segment of each chromosome has no change-point statistics.
bstat,pval,lclanducldescribe the change point at the end of a segment. The final segment of a chromosome has no change point at its end. These columns are therefore empty for 24 of the 59 rows in this sample.
5.2 Read the profile alongside the table
We recommend that you look at the genome-wide plot for each specimen, and that you read the segment table against that plot. Do not use the table alone. The table is a summary of a fitted model. It is not a direct measurement. The profile shows several important things that the table does not show.
- Segmentation applies a model with a constant value inside each segment. The true profile is sometimes not constant inside a segment. This occurs if the imbalance is gradual, if the tumour is subclonal, or if the sample is noisy. The reported change points are then the best fit of that model to the data. The plot shows how well the model describes the profile.
- Examine short segments with care.
min.width = 5permits a segment of five bins. In this sample the shortest segment has exactly five bins, and four segments have fewer than ten bins. A small number of scattered bins can produce a segment of that length. The plot shows whether the bins move to a new level or only scatter about the old level. - A small segment mean is ambiguous alone. The composition of the specimen compresses the observed ratio (Section 6). A true one-copy change in a specimen with low tumour content and noise in a clean specimen can give a similar
seg.mean. The context resolves this, and the plot shows the context. Does the change cover a complete chromosome arm? Does it start at a centromere? Do the adjacent regions agree? - An event below the resolution limit gives no segment. An event narrower than five local bins cannot become a segment. It can still be visible in the bin profile as a local group of shifted bins. Look at the profile before you conclude that a region has no change.
- The zero level belongs to the sample.
epxCNScentres the profile on the genome-wide median of the sample (Section 6). The plot shows whether the baseline is at the level of most of the genome, or whether a widespread imbalance moved it.
Use the table for coordinates and quantities. Use the profile to decide whether a segment is true. Confirm each result against the plot before you report it.
6 Interpreting relative log2 copy-number ratios
The method gives relative log2 ratios. These values are not absolute copy numbers. The difference is important when you read or compare profiles.
6.1 The values are relative in two senses
A log2 ratio is relative to the reference panel. After centring, it is also relative to the genome-wide baseline of the sample. A value of zero therefore shows the copy-number state of most of that specimen. It does not show a diploid state. In a genome with widespread imbalance, the centred zero level moves. Ratios from different samples therefore show deviations from the baseline of each sample.
6.2 Specimen composition compresses the observed ratio
The intensity at a probe is a bulk signal. It is an average over all cells in the specimen. If the specimen holds tumour cells and normal cells, the observed ratio moves toward zero. This effect increases with the quantity of non-tumour material. For a clonal event against a diploid background at tumour fraction \(\alpha\), the expected ratios are
\[ R_{\text{loss}} = \log_2\!\left( 1 - \tfrac{\alpha}{2} \right), \qquad R_{\text{gain}} = \log_2\!\left( 1 + \tfrac{\alpha}{2} \right) , \]
where the first equation gives the loss of one copy and the second gives the gain of one copy.
| Tumour fraction | One-copy loss | One-copy gain |
|---|---|---|
| 0.2 | −0.15 | +0.14 |
| 0.4 | −0.32 | +0.26 |
| 0.6 | −0.51 | +0.38 |
| 0.8 | −0.74 | +0.49 |
| 1.0 | −1.00 | +0.59 |
A heterozygous loss in a specimen with 40 % tumour content gives approximately −0.32. The same loss in a pure sample gives −1.00. One event therefore gives very different values with different specimen composition. You cannot get a copy state from a log2 ratio if you do not know the tumour content. Subclonal events are present in only part of the tumour population, and they compress more. A background that is not diploid moves the reference point for every ratio. The method therefore finds relative gains and losses. It does not give exact copy numbers.
6.3 Platform contribution
Two more properties of the array change the profile.
- Probe density is not even. Section 4 describes this. Bin widths follow the distribution of probes along the genome. The spatial precision of the profile therefore changes with the position in the genome.
- The dynamic range compresses. The relation between copy number and total intensity becomes flat at high copy number.
epxCNStherefore shows high-level amplifications at compressed log2 ratios. Those ratios are not proportional to copy number.
6.4 Resolution and the smallest reportable event
Two properties set the resolution. The first is the width of the local bins. The second is the rule that a segment must cover five bins or more (min.width in Table 4). The smallest event that epxCNS can report at a locus is therefore the distance that five adjacent bins cover at that locus. That distance changes with probe density, as Table 3 shows.
Table 9 gives that distance. We measured it on the bin annotations that epxCNS supplies. It is the distribution of the span of each run of five adjacent bins.
epxCNS supplies. Each percentile is an upper limit. On EPIC v2.0, five adjacent bins cover 550 kb or less at 75 % of loci. They cover 1.4 Mb or less at 95 % of loci. Large spans occur only in the regions with few probes, and they are not usual. The largest spans reach approximately 30 Mb.
| Array | Minimum | 25th percentile | Median | 75th percentile | 95th percentile |
|---|---|---|---|---|---|
| 450K | 210 kb | 350 kb | 550 kb | 1.0 Mb | 2.7 Mb |
| EPIC v1.0 | 210 kb | 300 kb | 350 kb | 600 kb | 1.5 Mb |
| EPIC v2.0 | 200 kb | 260 kb | 350 kb | 550 kb | 1.4 Mb |
New samples run on the EPIC v2.0 array. On that array, no segment can be narrower than 200 kb. At half of all loci the limit is 350 kb or less. We recommend that you quote that technical limit as the minimum reportable segment size. The limit is a property of the method.
6.5 Focal alterations are a separate question
Amplitude does not change the five-bin rule. A high-level amplification or a homozygous deletion inside fewer than five bins gives no segment. This is true for any value of its log2 ratio. At the loci that are important for diagnosis, this is the usual case and not the exception. 22 of the 29 detail regions cover fewer than five bins on EPIC v2.0.
| Region | Width | Probes | Bins spanned |
|---|---|---|---|
| MYC | 5.4 kb | 19 | 1 |
| MYCN | 6.6 kb | 26 | 1 |
| TP53 | 19.1 kb | 50 | 1 |
| MDM2 | 37.4 kb | 38 | 1 |
| TERT | 41.9 kb | 105 | 1 |
| CDK4 | 4.7 kb | 18 | 2 |
| CDKN2A/B | 41.6 kb | 97 | 2 |
| RB1 | 178.1 kb | 87 | 4 |
| EGFR | 188.3 kb | 214 | 5 |
A true amplicon or deletion is often larger than the gene. epxCNS then segments it in the usual way. But if the event is inside the gene only, the segment table does not hold it. The absence of a locus from the segment table is not evidence that the locus has no change.
The detail-region medians have this function. epxCNS computes them for each region from the probes in that region. That computation does not use the bins, and therefore does not use the five-bin rule. epxCNS reports a focal change at one of these loci for any extent of that change. Note that epxCNS reports only the median ratio for each region. It gives no significance value and no amplification threshold. You must therefore make the call downstream, from that value and from the bin-level profile (Section 5.2). Section 7 shows how to read the detail-region medians out of the result, with a worked example on this specimen.
7 Reading the results out
7.1 Segments
Two fields of the result hold the segment tables. Both are data frames, so use them directly.
cnv$seg_summary # one row for each segment
cnv$seg_p # the change-point statistics for the same segmentsSection 5.1 shows both tables and describes every column.
7.2 The plot with the detail regions
plot_cnv() marks and labels the 29 detail regions. show_detail = TRUE is the default, so the report of epxCNS shows them.
plot_cnv(cnv)epxCNS shows, because show_detail = TRUE is the default. CDKN2A/B on chromosome 9 is the lowest point, at −0.83. Some labels overlap on chromosomes 7 and 22, because several regions are close together there.
7.3 The detail-region table
The ratios and the gene identities are in two different fields. Join the two fields to get one table. detail_median_ratio holds the median ratio of each region. anno$detail holds the position and the gene name of each region.
A future version of epxCNS will supply a function for this join. Until that version is available, define cnv_get_detail() as follows.
cnv_get_detail <- function(cnv) {
data.frame(
gene = S4Vectors::values(cnv$anno$detail)$name,
chr = as.vector(GenomicRanges::seqnames(cnv$anno$detail)),
start = GenomicRanges::start(cnv$anno$detail),
end = GenomicRanges::end(cnv$anno$detail),
median_log2ratio = as.numeric(cnv$detail_median_ratio)
)
}
detail <- cnv_get_detail(cnv)Table 11 shows the output for the example specimen. It gives the eight regions with the lowest median ratio. The full table has 29 rows.
| gene | chr | start | end | median log2 ratio |
|---|---|---|---|---|
| CDKN2A/B | chr9 | 21967751 | 22009312 | −0.8262 |
| PTCH1 | chr9 | 98205264 | 98270831 | −0.2355 |
| MYBL1 | chr8 | 67474411 | 67525480 | −0.1645 |
| PTEN | chr10 | 89623195 | 89731687 | −0.1397 |
| CDK4 | chr12 | 58141510 | 58146230 | −0.1313 |
| NF2 | chr22 | 29999545 | 30094589 | −0.1000 |
| MGMT | chr10 | 131265454 | 131565783 | −0.0485 |
| RB1 | chr13 | 48877883 | 49056026 | −0.0314 |
CDKN2A/B has the lowest value, at −0.83. This is a focal homozygous deletion. The example shows why you need both read-outs. CDKN2A/B covers only 2 bins on the 450K array, and that is below the five-bin limit (Section 6.5). The segment table still holds the event, because the deletion extends past the gene. Chromosome 9 has a segment from 19,250,000 to 22,925,000 with 5 bins and a mean of −0.69. That segment has exactly the minimum width. Its mean is also higher than the detail median, because the segment covers 3.7 Mb and the detail region covers 41.6 kb. The detail read-out therefore gives the more local value.