ME/CFS Science Blog
Senior Member (Voting Rights)
With the help of @forestglip, I've finally managed to run linkage disequilibrium score regression (LDSC) on the DecodeME results. The original package is written in the outdated Python 2 which caused all sorts of errors. So I've used the Python package GWASlab which provides a wrapper function to run the code.
LDSC in gwaslab - GWASLab
As reference for LD structure we used the European LD scores from 1000 Genomes which can be downloaded here:
zenodo.org
The output looks like this:
The LDSC paper from 2015 suggests that for binary traits (having ME/CFS or not) h^2 is on the observed scale.
So to transform it to the liability scale as reported in the DecodeME paper we have to use this formula.

Heritability 201: Types of heritability and how we estimate it — Neale lab
Where K is the population prevalence and P is the prevalence of the trait in your GWAS. In R this becomes:
In The DecodeME paper they report a h^2 of 0.095. The ME/CFS prevalence that would convert our observed h^2 of 0.0405 to this number would be 0.65%. In other words, it seems like the DecodeME paper assumed a prevalence of 0.65% in calculating the heritability.
Also tried to calculate the LDSC using only SNP that had a MAF > 0.05 and using LD data from the UK biobank but the results were similar (h^2 = 0.0402 and 0.0405 respectively on the observed scale ). If you upload the DecodeME data to BigaGWAS it also gives the same result of h^2 = 0.0405.
LDSC in gwaslab - GWASLab
As reference for LD structure we used the European LD scores from 1000 Genomes which can be downloaded here:
European LD scores from 1000 Genomes
This is a gzipped copy of the European LD scores from 1000 Genomes provided by the Alkes Group, originally available at https://data.broadinstitute.org/alkesgroup/LDSCORE/eur_w_ld_chr.tar.bz2.
The output looks like this:
h2_obs | h2_se | Lambda_gc | Mean_chi2 | Intercept | Intercept_se | Ratio | Ratio_se | Catagories |
0.04058038 | 0.00291692 | 1.09947605 | 1.14169279 | 0.91415933 | 0.00766967 | Ratio < 0 | NA | NA |
The LDSC paper from 2015 suggests that for binary traits (having ME/CFS or not) h^2 is on the observed scale.
LD Score regression distinguishes confounding from polygenicity in genome-wide association studies - PubMed... This relationship holds for meta-analyses, and also for ascertained studies of binary phenotypes, in which case h2 is on the observed scale.
So to transform it to the liability scale as reported in the DecodeME paper we have to use this formula.

Heritability 201: Types of heritability and how we estimate it — Neale lab
Where K is the population prevalence and P is the prevalence of the trait in your GWAS. In R this becomes:
observed_to_liability <- function(h2_obs, K, P) {
# h2_obs: observed-scale heritability
# K: population prevalence
# P: proportion of cases in GWAS sample
# Calculate threshold corresponding to prevalence
t <- qnorm(1 - K)
# Height of standard normal distribution at that threshold
z <- dnorm(t)
conversion_factor <- (K * (1 - K))^2 / (P * (1 - P) * z^2)
h2_liability <- h2_obs * conversion_factor
return(h2_liability)
}
h2_liab <- observed_to_liability(h2_obs = 0.0405, K = 0.0065, P = 15579/(259909+15579))
In The DecodeME paper they report a h^2 of 0.095. The ME/CFS prevalence that would convert our observed h^2 of 0.0405 to this number would be 0.65%. In other words, it seems like the DecodeME paper assumed a prevalence of 0.65% in calculating the heritability.
Also tried to calculate the LDSC using only SNP that had a MAF > 0.05 and using LD data from the UK biobank but the results were similar (h^2 = 0.0402 and 0.0405 respectively on the observed scale ). If you upload the DecodeME data to BigaGWAS it also gives the same result of h^2 = 0.0405.
Last edited: