epxCNS Copy-Number Variation (CNV)

Methods

Author

Epignostix

Published

August 12, 2026

Abstract

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.

Figure 1: Data objects and how 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:

  1. 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 epxCNS detected.
  2. Compute the copy-number signal as the combined intensity \(I = M + U\) for each probe.
  3. Fit the query intensities against the matched reference panel. Take the residual as the per-probe log2 ratio (Section 3).
  4. Group the probe ratios into the genomic bins of the bin annotation. Centre the profile (Section 4).
  5. 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.

Table 1: Components of the copy-number result.
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.

Table 2: The six reference panels.
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.

Figure 2: Tangent normalization on the example 450K specimen. Each point is one probe, and the figure shows 482,421 probes. The horizontal axis is the intensity fitted from the 50 sex-matched reference samples. The vertical axis is the observed intensity. Both axes use a log2 scale. The dashed line is the identity line. On that line \(R = 0\). The vertical distance from the line is the copy-number log2 ratio \(R\). The figure marks \(R\) for one probe with a relative loss. Probes above the line have a relative gain, and probes below the line have a relative loss. 0.04 % of the probes fall outside the plotted range. This figure is the 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.

  1. 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.
  2. Tile. Divide each chromosome into 50 kb windows. Cut the last window of each chromosome at the end of the chromosome.
  3. 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.
  4. Count probes. Count the array probes in each window.
  5. 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.
  6. 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.
  7. 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.

Figure 3: How 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.

Table 3: Bins per array. We measured the widths on the bin annotation that 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.

Figure 4: Log2 copy-number profile over the whole genome. Each point is one genomic bin, in order along the genome. The vertical axis is the log2 ratio of the observed intensity to the fitted reference intensity. Blue points are above zero and show a relative gain. Red points are below zero and show a relative loss. The default plot omits chromosome Y. The sample is the 450K specimen that 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.

Table 4: Segmentation 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.

Figure 5: The same profile with the segments from circular binary segmentation in dark blue. Each horizontal line covers one segment at its mean log2 ratio.

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.

Table 5: Segmentation output for chromosome 1 of the example 450K specimen. The table shows every column, in the order that 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.

Table 6: The parallel change-point table, for the same five segments. That table also has an 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.

Table 7: Columns of the segmentation output.
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.mark counts 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.start is 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. chr10 therefore follows chr1 and not chr9. Sort the rows numerically if you need genomic order.
  • The last segment of each chromosome has no change-point statistics. bstat, pval, lcl and ucl describe 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 = 5 permits 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. epxCNS centres 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.

Table 8: Expected log2 ratio of a clonal one-copy change against a diploid background, by tumour fraction.
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. epxCNS therefore 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.

Table 9: The span of five adjacent bins. We measured the spans on the bin annotation that 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.

Table 10: Selected detail regions on EPIC v2.0 and the number of bins that each region covers. A change inside any of the first eight regions is below the five-bin segmentation limit.
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 segments

Section 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)
Figure 6: The profile of the example specimen. The figure marks the 29 detail regions. Each black point is the median log2 ratio of one region. The dark blue horizontal lines are the segments. This is the view that the report of 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.

Table 11: The eight detail regions with the lowest median log2 ratio, for the example 450K specimen.
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.

References

Daenekas, Bjarne, Elena Pfister, Cyril Ammar, et al. 2024. “Conumee 2.0: Enhanced Copy-Number Variation Analysis from DNA Methylation Arrays for Humans and Mice.” Bioinformatics 40 (2): btae029. https://doi.org/10.1093/bioinformatics/btae029.
Feber, Andrew, Paul Guilhamon, Matthias Lechner, et al. 2014. “Using High-Density DNA Methylation Arrays to Profile Copy Number Alterations.” Genome Biology 15 (2): R30. https://doi.org/10.1186/gb-2014-15-2-r30.
Gao, Galen F., Coyin Oh, Gordon Saksena, et al. 2022. “Tangent Normalization for Somatic Copy-Number Inference in Cancer Genome Analysis.” Bioinformatics 38 (20): 4677–86. https://doi.org/10.1093/bioinformatics/btac586.
Hovestadt, Volker, and Marc Zapatka. 2015. Conumee: Enhanced Copy-Number Variation Analysis Using Illumina DNA Methylation Arrays. German Cancer Research Center (DKFZ), Division of Molecular Genetics.
Moqri, Mahdi, Kejun Ying, Jesse R. Poganik, et al. 2026. “Integrative Epigenetics and Transcriptomics Identify Aging Genes in Human Blood.” Nature Communications 17 (1): 725. https://doi.org/10.1038/s41467-025-67369-1.
Olshen, Adam B., E. S. Venkatraman, Robert Lucito, and Michael Wigler. 2004. “Circular Binary Segmentation for the Analysis of Array-Based DNA Copy Number Data.” Biostatistics 5 (4): 557–72. https://doi.org/10.1093/biostatistics/kxh008.
Venkatraman, E. S., and Adam B. Olshen. 2007. “A Faster Circular Binary Segmentation Algorithm for the Analysis of Array CGH Data.” Bioinformatics 23 (6): 657–63. https://doi.org/10.1093/bioinformatics/btl646.