gwaslab 3.6.7__tar.gz → 3.6.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of gwaslab might be problematic. Click here for more details.
- {gwaslab-3.6.7/src/gwaslab.egg-info → gwaslab-3.6.9}/PKG-INFO +1 -1
- {gwaslab-3.6.7 → gwaslab-3.6.9}/pyproject.toml +1 -1
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_Sumstats.py +4 -1
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_version.py +2 -2
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_phewwas.py +57 -5
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_aux_save_figure.py +2 -1
- gwaslab-3.6.9/src/gwaslab/viz/viz_plot_associations.py +61 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_mqqplot.py +52 -8
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_qqplot.py +8 -26
- gwaslab-3.6.9/src/gwaslab/viz/viz_plot_template.py +98 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_trumpetplot.py +4 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9/src/gwaslab.egg-info}/PKG-INFO +1 -1
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab.egg-info/SOURCES.txt +2 -1
- gwaslab-3.6.7/src/gwaslab/hm_harmonize_sumstats.py +0 -1630
- {gwaslab-3.6.7 → gwaslab-3.6.9}/LICENSE +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/LICENSE_before_v3.4.39 +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/README.md +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/setup.cfg +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/__init__.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/bd/bd_common_data.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/bd/bd_config.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/bd/bd_download.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/bd/bd_get_hapmap3.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/bd/bd_path_manager.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/cache_manager.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/data/chrx_par/chrx_par_hg19.bed.gz +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/data/chrx_par/chrx_par_hg38.bed.gz +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/data/formatbook.json +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/data/hapmap3_SNPs/hapmap3_db150_hg19.snplist.gz +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/data/hapmap3_SNPs/hapmap3_db151_hg38.snplist.gz +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/data/high_ld/high_ld_hla_hg19.bed.gz +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/data/high_ld/high_ld_hla_hg38.bed.gz +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/data/reference.json +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/extension/ldsc/ldsc_irwls.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/extension/ldsc/ldsc_jackknife.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/extension/ldsc/ldsc_ldscore.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/extension/ldsc/ldsc_parse.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/extension/ldsc/ldsc_regressions.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/extension/ldsc/ldsc_sumstats.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/extension/prscs/prscs_gigrnd.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/extension/prscs/prscs_mcmc_gtb.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/extension/prscs/prscs_parse_genet.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_Log.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_Phenotypes.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_SumstatsMulti.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_SumstatsPair.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_SumstatsSet.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_SumstatsT.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_Sumstats_polars.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_Sumstats_summary.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_headers.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_meta.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_meta_update.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_vchange_status.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/g_vchange_status_polars.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/hm/hm_casting.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/hm/hm_casting_polars.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/hm/hm_harmonize_sumstats.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/hm/hm_rsid_to_chrpos.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/io/io_load_ld.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/io/io_preformat_input.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/io/io_preformat_input_polars.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/io/io_process_args.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/io/io_read_ldsc.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/io/io_read_pipcs.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/io/io_read_tabular.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/io/io_to_formats.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/io/io_to_pickle.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/qc/qc_build.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/qc/qc_check_datatype.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/qc/qc_check_datatype_polars.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/qc/qc_fix_sumstats.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/qc/qc_fix_sumstats_polars.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/run_script.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_abf_finemapping.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_calculate_ldmatrix.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_calculate_prs.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_gwascatalog.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_infer_ancestry.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_ldproxyfinder.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_ldsc.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_match_ldmatrix.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_plink_filter.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_process_h5.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_process_ref.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_run_2samplemr.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_run_ccgwas.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_run_clumping.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_run_coloc.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_run_hyprcoloc.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_run_magma.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_run_mesusie.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_run_mtag.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_run_prscs.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_run_scdrs.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_ex_run_susie.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_calculate_gc.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_calculate_power.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_convert_h2.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_correct_winnerscurse.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_estimate_ess.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_fill_data.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_filter_value.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_get_density.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_get_sig.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_merge.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_meta.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_meta_polars.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/util/util_in_snphwe.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_aux_annotate_plot.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_aux_chromatin.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_aux_property.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_aux_quickfix.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_aux_reposition_text.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_compare_af.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_compare_effect.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_credible_sets.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_effect.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_forestplot.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_miamiplot.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_miamiplot2.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_phe_heatmap.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_regional2.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_regionalplot.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_rg_heatmap.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_scatter_with_reg.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab/viz/viz_plot_stackedregional.py +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab.egg-info/dependency_links.txt +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab.egg-info/requires.txt +0 -0
- {gwaslab-3.6.7 → gwaslab-3.6.9}/src/gwaslab.egg-info/top_level.txt +0 -0
|
@@ -102,7 +102,7 @@ from gwaslab.viz.viz_plot_mqqplot import mqqplot
|
|
|
102
102
|
from gwaslab.viz.viz_plot_trumpetplot import plottrumpet
|
|
103
103
|
from gwaslab.viz.viz_plot_compare_af import plotdaf
|
|
104
104
|
from gwaslab.viz.viz_plot_credible_sets import _plot_cs
|
|
105
|
-
|
|
105
|
+
from gwaslab.viz.viz_plot_associations import _plot_associations
|
|
106
106
|
from gwaslab.io.io_read_pipcs import _read_pipcs
|
|
107
107
|
from gwaslab.io.io_load_ld import tofinemapping_using_ld
|
|
108
108
|
from gwaslab.io.io_preformat_input import preformat
|
|
@@ -811,6 +811,9 @@ class Sumstats():
|
|
|
811
811
|
self.associations = associations_full
|
|
812
812
|
|
|
813
813
|
return associations_summary
|
|
814
|
+
def plot_associations(self,**kwargs):
|
|
815
|
+
|
|
816
|
+
_plot_associations(self.associations, **kwargs)
|
|
814
817
|
|
|
815
818
|
def check_cis(self, gls=False, **kwargs):
|
|
816
819
|
if "SNPID" in self.data.columns:
|
|
@@ -7,6 +7,11 @@ def _extract_associations(sumstats, rsid="rsID", log = Log(), verbose=True):
|
|
|
7
7
|
|
|
8
8
|
assoc, traits, studies, variants = get_associations_from_gwascatalog(sumstats, rsid=rsid, log=log, verbose=verbose)
|
|
9
9
|
|
|
10
|
+
if len(assoc)==0:
|
|
11
|
+
# if no associations
|
|
12
|
+
log.write("No associations!")
|
|
13
|
+
return None, None
|
|
14
|
+
|
|
10
15
|
assoc = _fix_beta(assoc)
|
|
11
16
|
|
|
12
17
|
traits_agg = traits.groupby("associationId")[["trait","shortForm"]].agg(lambda x: ",".join(x)).reset_index()
|
|
@@ -14,21 +19,25 @@ def _extract_associations(sumstats, rsid="rsID", log = Log(), verbose=True):
|
|
|
14
19
|
assoc_traits_agg= pd.merge(assoc, traits_agg, on ="associationId",how="left")
|
|
15
20
|
|
|
16
21
|
assoc_traits_agg= pd.merge(assoc_traits_agg, studies, on ="associationId", how="left")
|
|
17
|
-
|
|
22
|
+
|
|
18
23
|
assoc_traits_agg= pd.merge(assoc_traits_agg, variants, on ="associationId",how="left")
|
|
19
24
|
|
|
20
25
|
assoc_traits_agg = assoc_traits_agg.rename(columns={"trait":"GWASCATALOG_TRAIT",
|
|
21
26
|
"riskFrequency":"RAF",
|
|
22
27
|
"betaNum":"Beta",
|
|
23
|
-
"pvalue":"P-value"
|
|
28
|
+
"pvalue":"P-value",
|
|
29
|
+
"betaUnit":"Unit"
|
|
24
30
|
})
|
|
25
31
|
|
|
26
32
|
summary_columns=['GWASCATALOG_TRAIT','associationId', 'rsID', "geneName",
|
|
27
|
-
'RA', 'RAF','Beta', 'P-value','cohort','initialSampleSize','publicationInfo.pubmedId',
|
|
33
|
+
'RA', 'RAF','Beta',"Unit", 'P-value','cohort','initialSampleSize','publicationInfo.pubmedId',
|
|
28
34
|
"functionalClass","gene.geneName"]
|
|
29
35
|
|
|
30
36
|
assoc_traits_agg_summary = assoc_traits_agg[summary_columns]
|
|
31
37
|
|
|
38
|
+
assoc_traits_agg_summary = _align_beta(sumstats, assoc_traits_agg_summary, log, verbose)
|
|
39
|
+
assoc_traits_agg = _align_beta(sumstats, assoc_traits_agg, log, verbose)
|
|
40
|
+
|
|
32
41
|
return assoc_traits_agg, assoc_traits_agg_summary
|
|
33
42
|
|
|
34
43
|
def get_associations_from_gwascatalog(sumstats, rsid="rsID", log=Log(), verbose=True):
|
|
@@ -101,7 +110,12 @@ def get_associations_from_gwascatalog(sumstats, rsid="rsID", log=Log(), verbose=
|
|
|
101
110
|
return association, traits, studies, variants
|
|
102
111
|
|
|
103
112
|
def _fix_beta(association):
|
|
104
|
-
|
|
113
|
+
if "betaNum" not in association:
|
|
114
|
+
association["betaNum"] = pd.NA
|
|
115
|
+
if "orPerCopyNum" not in association:
|
|
116
|
+
association["orPerCopyNum"] = pd.NA
|
|
117
|
+
if "range" not in association:
|
|
118
|
+
association["range"] = pd.NA
|
|
105
119
|
is_or_available = (association["betaNum"].isna()) & (~association["orPerCopyNum"].isna())
|
|
106
120
|
is_range_available = (association["betaNum"].isna()) & (association["orPerCopyNum"].isna()) & (~association["range"].isna())
|
|
107
121
|
|
|
@@ -114,4 +128,42 @@ def parse_range(x):
|
|
|
114
128
|
high = np.log(range_list[1])
|
|
115
129
|
low = np.log(range_list[0])
|
|
116
130
|
beta = (high + low)/2
|
|
117
|
-
return beta
|
|
131
|
+
return beta
|
|
132
|
+
|
|
133
|
+
def _align_beta(sumstats, assoc_traits_agg_summary, log, verbose):
|
|
134
|
+
# merge with sumstats
|
|
135
|
+
log.write("Merging GWAS Catalog associationms with Sumstats...",)
|
|
136
|
+
assoc_traits_agg_summary = pd.merge(sumstats[["rsID","CHR","POS","EA","NEA","BETA"]], assoc_traits_agg_summary, on = "rsID", how="inner")
|
|
137
|
+
# check direction
|
|
138
|
+
assoc_traits_agg_summary["GC_Beta_GL_RA"] = np.nan
|
|
139
|
+
assoc_traits_agg_summary["GC_Beta_GL_EA"] = np.nan
|
|
140
|
+
|
|
141
|
+
# get sumstats RA
|
|
142
|
+
assoc_traits_agg_summary["_GL_RA_BETA"] = assoc_traits_agg_summary["BETA"].abs()
|
|
143
|
+
assoc_traits_agg_summary["_GL_RA"] = assoc_traits_agg_summary["EA"]
|
|
144
|
+
assoc_traits_agg_summary["_GL_NRA"] = assoc_traits_agg_summary["NEA"]
|
|
145
|
+
is_GL_RA_flipped = assoc_traits_agg_summary["BETA"]<0
|
|
146
|
+
assoc_traits_agg_summary.loc[is_GL_RA_flipped, "_GL_RA"] = assoc_traits_agg_summary.loc[is_GL_RA_flipped, "NEA"]
|
|
147
|
+
assoc_traits_agg_summary.loc[is_GL_RA_flipped, "_GL_NRA"] = assoc_traits_agg_summary.loc[is_GL_RA_flipped, "EA"]
|
|
148
|
+
|
|
149
|
+
is_matched = assoc_traits_agg_summary["_GL_RA"] == assoc_traits_agg_summary["RA"]
|
|
150
|
+
log.write(" -GL_RA matched RA for {} variants ".format(sum(is_matched)), verbose=verbose)
|
|
151
|
+
assoc_traits_agg_summary.loc[is_matched, "GC_Beta_GL_RA"] = assoc_traits_agg_summary.loc[is_matched, "Beta"]
|
|
152
|
+
|
|
153
|
+
is_flipped = assoc_traits_agg_summary["_GL_NRA"] == assoc_traits_agg_summary["RA"]
|
|
154
|
+
log.write(" -GL_NRA matched RA for {} variants... Aligning with Sumstats Risk allele (BETA>0) in GC_Beta_GL_RA... ".format(sum(is_flipped)), verbose=verbose)
|
|
155
|
+
assoc_traits_agg_summary.loc[is_flipped, "GC_Beta_GL_RA"] = - assoc_traits_agg_summary.loc[is_flipped, "Beta"]
|
|
156
|
+
|
|
157
|
+
is_matched = assoc_traits_agg_summary["EA"] == assoc_traits_agg_summary["RA"]
|
|
158
|
+
log.write(" -EA matched RA for {} variants ".format(sum(is_matched)), verbose=verbose)
|
|
159
|
+
assoc_traits_agg_summary.loc[is_matched, "GC_Beta_GL_EA"] = assoc_traits_agg_summary.loc[is_matched, "Beta"]
|
|
160
|
+
|
|
161
|
+
is_flipped = assoc_traits_agg_summary["NEA"] == assoc_traits_agg_summary["RA"]
|
|
162
|
+
log.write(" -NEA matched RA for {} variants... Aligning with Sumstats Risk allele (BETA>0) in GC_Beta_GL_RA... ".format(sum(is_flipped)), verbose=verbose)
|
|
163
|
+
assoc_traits_agg_summary.loc[is_flipped, "GC_Beta_GL_EA"] = - assoc_traits_agg_summary.loc[is_flipped, "Beta"]
|
|
164
|
+
|
|
165
|
+
not_match = (assoc_traits_agg_summary["_GL_RA"] != assoc_traits_agg_summary["RA"])& (assoc_traits_agg_summary["_GL_NRA"] != assoc_traits_agg_summary["RA"])
|
|
166
|
+
log.write(" -NEA and EA not matching RA for {} variants... ".format(sum(not_match)), verbose=verbose)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
return assoc_traits_agg_summary
|
|
@@ -53,7 +53,8 @@ def get_default_path(keyword,fmt="png"):
|
|
|
53
53
|
"afc":"allele_frequency_comparision",
|
|
54
54
|
"gwheatmap":"genome_wide_heatmap",
|
|
55
55
|
"scatter":"scatter",
|
|
56
|
-
"forest":"forest"
|
|
56
|
+
"forest":"forest",
|
|
57
|
+
"gwaslab":"gwaslab"
|
|
57
58
|
}
|
|
58
59
|
prefix = path_dictionary[keyword]
|
|
59
60
|
count = 1
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import seaborn as sns
|
|
2
|
+
import matplotlib.pyplot as plt
|
|
3
|
+
from gwaslab.io.io_process_args import _update_args
|
|
4
|
+
from gwaslab.io.io_process_args import _update_arg
|
|
5
|
+
from gwaslab.g_Log import Log
|
|
6
|
+
|
|
7
|
+
def _plot_associations(associations,
|
|
8
|
+
values="Beta",
|
|
9
|
+
fig_args=None,
|
|
10
|
+
log=Log(),
|
|
11
|
+
verbose=True,
|
|
12
|
+
sort="P-value",
|
|
13
|
+
fontsize=12,
|
|
14
|
+
font_family="Arial",
|
|
15
|
+
cmap=None,
|
|
16
|
+
ylabel="Traits",
|
|
17
|
+
xlabel="rsID - Gene Name",
|
|
18
|
+
**args
|
|
19
|
+
):
|
|
20
|
+
|
|
21
|
+
log.write("Start to create heatmap for associations...", verbose=verbose)
|
|
22
|
+
|
|
23
|
+
cmap = _update_arg(cmap, "RdBu")
|
|
24
|
+
|
|
25
|
+
log.write(f" -Value to plot: {values}", verbose=verbose)
|
|
26
|
+
log.write(f" -Total number of associations :{len(associations)} ", verbose=verbose)
|
|
27
|
+
log.write(f" -Sorting associations by :{sort} ", verbose=verbose)
|
|
28
|
+
|
|
29
|
+
associations = associations.sort_values(by=[sort]).drop_duplicates(subset=["rsID","GWASCATALOG_TRAIT"])
|
|
30
|
+
|
|
31
|
+
log.write(f" -Keeping unique rsID-traits pairs :{len(associations)} ", verbose=verbose)
|
|
32
|
+
|
|
33
|
+
associations = associations.dropna(subset=[values])
|
|
34
|
+
log.write(f" -Keeping associations without NA in {values} :{len(associations)} ", verbose=verbose)
|
|
35
|
+
|
|
36
|
+
log.write(f" -Total number of unique variants for plotting :{associations["rsID"].nunique()} ", verbose=verbose)
|
|
37
|
+
log.write(f" -Total number of unique traits for plotting:{associations["GWASCATALOG_TRAIT"].nunique()} ", verbose=verbose)
|
|
38
|
+
|
|
39
|
+
matrix_beta = associations.pivot_table(index=['rsID','gene.geneName'],
|
|
40
|
+
columns='GWASCATALOG_TRAIT',
|
|
41
|
+
values=[values])
|
|
42
|
+
|
|
43
|
+
matrix_beta = matrix_beta.astype("float64")
|
|
44
|
+
|
|
45
|
+
matrix_beta.columns = matrix_beta.columns.droplevel(0)
|
|
46
|
+
|
|
47
|
+
height = max(2, len(matrix_beta)//2)
|
|
48
|
+
width = max(2, len(matrix_beta.columns)//2)
|
|
49
|
+
|
|
50
|
+
fig_args = _update_args(fig_args, dict(figsize=(width,height)))
|
|
51
|
+
fig,ax = plt.subplots(**fig_args)
|
|
52
|
+
|
|
53
|
+
sns.heatmap(matrix_beta.T, annot=True, fmt=".2f",cmap="RdBu",ax=ax)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
ax.set_xlabel(xlabel,fontsize=fontsize, fontfamily=font_family)
|
|
57
|
+
ax.set_ylabel(ylabel,fontsize=fontsize, fontfamily=font_family)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
log.write("Finished creating heatmap for associations.", verbose=verbose)
|
|
61
|
+
return fig, ax
|
|
@@ -100,6 +100,8 @@ def mqqplot(insumstats,
|
|
|
100
100
|
qq_scatter_args=None,
|
|
101
101
|
qqscatterargs=None,
|
|
102
102
|
qq_line_color = "grey",
|
|
103
|
+
qq_xlabels = None,
|
|
104
|
+
qq_xlim = None,
|
|
103
105
|
# region
|
|
104
106
|
region = None,
|
|
105
107
|
region_title=None,
|
|
@@ -204,6 +206,8 @@ def mqqplot(insumstats,
|
|
|
204
206
|
highlight_color="#CB132D",
|
|
205
207
|
highlight_windowkb = 500,
|
|
206
208
|
highlight_anno_args = None,
|
|
209
|
+
highlight_lim = None,
|
|
210
|
+
highlight_lim_mode = "absolute",
|
|
207
211
|
pinpoint= None,
|
|
208
212
|
pinpoint_color ="red",
|
|
209
213
|
stratified=False,
|
|
@@ -531,6 +535,8 @@ def mqqplot(insumstats,
|
|
|
531
535
|
highlight=highlight,
|
|
532
536
|
highlight_chrpos=highlight_chrpos,
|
|
533
537
|
highlight_windowkb=highlight_windowkb,
|
|
538
|
+
highlight_lim = highlight_lim,
|
|
539
|
+
highlight_lim_mode = highlight_lim_mode,
|
|
534
540
|
snpid=snpid,
|
|
535
541
|
chrom=chrom,
|
|
536
542
|
pos=pos)
|
|
@@ -1096,6 +1102,8 @@ def mqqplot(insumstats,
|
|
|
1096
1102
|
linewidth=sc_linewidth,
|
|
1097
1103
|
ytick3 = ytick3,
|
|
1098
1104
|
ylabels = ylabels,
|
|
1105
|
+
xlabels = qq_xlabels,
|
|
1106
|
+
xlim = qq_xlim,
|
|
1099
1107
|
ylabels_converted = ylabels_converted,
|
|
1100
1108
|
verbose=verbose,
|
|
1101
1109
|
qq_scatter_args=qq_scatter_args,
|
|
@@ -1335,19 +1343,38 @@ def _process_p_value(sumstats, mode,p, mlog10p, scaled, log, verbose ):
|
|
|
1335
1343
|
|
|
1336
1344
|
return sumstats
|
|
1337
1345
|
|
|
1338
|
-
def _process_highlight(sumstats, highlight, highlight_chrpos, highlight_windowkb, snpid, chrom, pos):
|
|
1346
|
+
def _process_highlight(sumstats, highlight, highlight_chrpos, highlight_windowkb, highlight_lim, highlight_lim_mode, snpid, chrom, pos):
|
|
1339
1347
|
if pd.api.types.is_list_like(highlight[0]):
|
|
1340
1348
|
if highlight_chrpos == False:
|
|
1341
1349
|
# highlight for multiple sets
|
|
1342
1350
|
for i, highlight_set in enumerate(highlight):
|
|
1343
1351
|
to_highlight = sumstats.loc[sumstats[snpid].isin(highlight_set),:]
|
|
1344
1352
|
#assign colors: 0 is hightlight color
|
|
1345
|
-
|
|
1353
|
+
#assign colors: i is highlight color
|
|
1354
|
+
for j, (index, row) in enumerate(to_highlight.iterrows()):
|
|
1346
1355
|
target_chr = int(row[chrom])
|
|
1347
1356
|
target_pos = int(row[pos])
|
|
1348
1357
|
right_chr=sumstats[chrom]==target_chr
|
|
1349
|
-
|
|
1350
|
-
|
|
1358
|
+
# Check if highlight_lim is provided for this group and SNP
|
|
1359
|
+
if (highlight_lim is not None and
|
|
1360
|
+
i < len(highlight_lim) and
|
|
1361
|
+
j < len(highlight_lim[i]) and
|
|
1362
|
+
highlight_lim[i][j] is not None):
|
|
1363
|
+
# Use custom limits for this SNP
|
|
1364
|
+
if highlight_lim_mode == "absolute":
|
|
1365
|
+
# Absolute positions: (start_pos, end_pos)
|
|
1366
|
+
start_pos, end_pos = highlight_lim[i][j]
|
|
1367
|
+
up_pos = sumstats[pos] >= start_pos
|
|
1368
|
+
low_pos = sumstats[pos] <= end_pos
|
|
1369
|
+
else:
|
|
1370
|
+
# Offset mode: (lower_kb, upper_kb) relative to SNP position
|
|
1371
|
+
lower_kb, upper_kb = highlight_lim[i][j]
|
|
1372
|
+
up_pos = sumstats[pos] > target_pos + lower_kb * 1000
|
|
1373
|
+
low_pos = sumstats[pos] < target_pos + upper_kb * 1000
|
|
1374
|
+
else:
|
|
1375
|
+
# Use default highlight_windowkb
|
|
1376
|
+
up_pos = sumstats[pos] > target_pos - highlight_windowkb * 1000
|
|
1377
|
+
low_pos = sumstats[pos] < target_pos + highlight_windowkb * 1000
|
|
1351
1378
|
sumstats.loc[right_chr&up_pos&low_pos,"HUE"]=i
|
|
1352
1379
|
else:
|
|
1353
1380
|
for i, highlight_chrpos_tuple in enumerate(highlight):
|
|
@@ -1371,13 +1398,30 @@ def _process_highlight(sumstats, highlight, highlight_chrpos, highlight_windowkb
|
|
|
1371
1398
|
else:
|
|
1372
1399
|
# highlight for one set
|
|
1373
1400
|
to_highlight = sumstats.loc[sumstats[snpid].isin(highlight),:]
|
|
1374
|
-
#assign colors: 0 is
|
|
1375
|
-
for index,row in to_highlight.iterrows():
|
|
1401
|
+
#assign colors: 0 is highlight color
|
|
1402
|
+
for j, (index, row) in enumerate(to_highlight.iterrows()):
|
|
1376
1403
|
target_chr = int(row[chrom])
|
|
1377
1404
|
target_pos = int(row[pos])
|
|
1378
1405
|
right_chr=sumstats[chrom]==target_chr
|
|
1379
|
-
|
|
1380
|
-
|
|
1406
|
+
# Check if highlight_lim is provided for this SNP
|
|
1407
|
+
if (highlight_lim is not None and
|
|
1408
|
+
j < len(highlight_lim) and
|
|
1409
|
+
highlight_lim[j] is not None):
|
|
1410
|
+
# Use custom limits for this SNP
|
|
1411
|
+
if highlight_lim_mode == "absolute":
|
|
1412
|
+
# Absolute positions: (start_pos, end_pos)
|
|
1413
|
+
start_pos, end_pos = highlight_lim[j]
|
|
1414
|
+
up_pos = sumstats[pos] >= start_pos
|
|
1415
|
+
low_pos = sumstats[pos] <= end_pos
|
|
1416
|
+
else:
|
|
1417
|
+
# Offset mode: (lower_kb, upper_kb) relative to SNP position
|
|
1418
|
+
lower_kb, upper_kb = highlight_lim[j]
|
|
1419
|
+
up_pos = sumstats[pos] > target_pos + lower_kb * 1000
|
|
1420
|
+
low_pos = sumstats[pos] < target_pos + upper_kb * 1000
|
|
1421
|
+
else:
|
|
1422
|
+
# Use default highlight_windowkb
|
|
1423
|
+
up_pos = sumstats[pos] > target_pos - highlight_windowkb * 1000
|
|
1424
|
+
low_pos = sumstats[pos] < target_pos + highlight_windowkb * 1000
|
|
1381
1425
|
sumstats.loc[right_chr&up_pos&low_pos,"HUE"]=0
|
|
1382
1426
|
return sumstats
|
|
1383
1427
|
|
|
@@ -39,6 +39,8 @@ def _plot_qq(
|
|
|
39
39
|
linewidth,
|
|
40
40
|
ytick3,
|
|
41
41
|
ylabels,
|
|
42
|
+
xlabels,
|
|
43
|
+
xlim,
|
|
42
44
|
ylabels_converted,
|
|
43
45
|
qq_scatter_args,
|
|
44
46
|
expected_min_mlog10p,
|
|
@@ -155,32 +157,12 @@ def _plot_qq(
|
|
|
155
157
|
log=log,
|
|
156
158
|
verbose=verbose
|
|
157
159
|
)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
# step=2
|
|
165
|
-
# if ((maxticker-cut)/cutfactor + cut) > cut:
|
|
166
|
-
# if ystep == 0:
|
|
167
|
-
# if (cut - skip ) // step > 10:
|
|
168
|
-
# step = (cut - skip ) // 10
|
|
169
|
-
# else:
|
|
170
|
-
# step = ystep
|
|
171
|
-
#
|
|
172
|
-
# ax2.set_yticks([x for x in range(skip,cut-step,step)]+[cut]+[(maxticker-cut)/cutfactor + cut])
|
|
173
|
-
# ax2.set_yticklabels([x for x in range(skip,cut-step,step)]+[cut]+[maxticker],fontsize=fontsize,family=font_family)
|
|
174
|
-
# else:
|
|
175
|
-
# if ystep == 0:
|
|
176
|
-
# if (cut - skip ) // step > 10:
|
|
177
|
-
# step = (cut - skip ) // 10
|
|
178
|
-
# else:
|
|
179
|
-
# step = ystep
|
|
180
|
-
#
|
|
181
|
-
# ax2.set_yticks([x for x in range(skip,cut-step,step)]+[cut])
|
|
182
|
-
# ax2.set_yticklabels([x for x in range(skip,cut-step,step)]+[cut],fontsize=fontsize,family=font_family)
|
|
183
|
-
# ax2.set_ylim(bottom = skip)
|
|
160
|
+
if xlim is not None:
|
|
161
|
+
ax2.set_xlim(xlim)
|
|
162
|
+
|
|
163
|
+
if xlabels is not None:
|
|
164
|
+
ax2.set_xticks(xlabels)
|
|
165
|
+
ax2.set_xticklabels(xlabels,fontsize=fontsize,family=font_family)
|
|
184
166
|
|
|
185
167
|
ax2.tick_params(axis='both', which='both', labelsize=fontsize,labelfontfamily=font_family)
|
|
186
168
|
#
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import seaborn as sns
|
|
2
|
+
import matplotlib.pyplot as plt
|
|
3
|
+
from gwaslab.io.io_process_args import _update_args
|
|
4
|
+
from gwaslab.io.io_process_args import _update_arg
|
|
5
|
+
from gwaslab.g_Log import Log
|
|
6
|
+
from gwaslab.viz.viz_aux_save_figure import save_figure
|
|
7
|
+
|
|
8
|
+
def _plot( associations,
|
|
9
|
+
values="Beta",
|
|
10
|
+
sort="P-value",
|
|
11
|
+
mode="gwaslab",
|
|
12
|
+
fontsize=12,
|
|
13
|
+
font_family="Arial",
|
|
14
|
+
cmap=None,
|
|
15
|
+
ylabel="Y",
|
|
16
|
+
xlabel="X",
|
|
17
|
+
xlim=None,
|
|
18
|
+
ylim=None,
|
|
19
|
+
yticks=None,
|
|
20
|
+
xticks=None,
|
|
21
|
+
title="Title",
|
|
22
|
+
title_pad=1.08,
|
|
23
|
+
title_fontsize=13,
|
|
24
|
+
linewidth=None,
|
|
25
|
+
linestyle=None,
|
|
26
|
+
linecolor=None,
|
|
27
|
+
dpi=200,
|
|
28
|
+
fig_args= None,
|
|
29
|
+
scatter_args=None,
|
|
30
|
+
save=None,
|
|
31
|
+
save_args=None,
|
|
32
|
+
log=Log(),
|
|
33
|
+
verbose=True,
|
|
34
|
+
**args
|
|
35
|
+
):
|
|
36
|
+
|
|
37
|
+
# update args
|
|
38
|
+
|
|
39
|
+
cmap = _update_arg(cmap, "RdBu")
|
|
40
|
+
|
|
41
|
+
fig_args = _update_args(fig_args, dict(figsize=(10,10)))
|
|
42
|
+
|
|
43
|
+
# create fig and ax
|
|
44
|
+
fig,ax = plt.subplots(**fig_args)
|
|
45
|
+
|
|
46
|
+
# draw lines
|
|
47
|
+
horizontal_line = ax.axhline(y=1, linewidth = linewidth,
|
|
48
|
+
linestyle="--",
|
|
49
|
+
color=linecolor,zorder=1000)
|
|
50
|
+
vertical_line = ax.axvline(x=1, linewidth = linewidth,
|
|
51
|
+
linestyle="--",
|
|
52
|
+
color=linecolor,zorder=1000)
|
|
53
|
+
|
|
54
|
+
# ticks
|
|
55
|
+
if xticks is not None:
|
|
56
|
+
ax.set_xticks(xticks)
|
|
57
|
+
ax.set_xticklabels(xticks,
|
|
58
|
+
fontsize=fontsize,
|
|
59
|
+
family=font_family)
|
|
60
|
+
|
|
61
|
+
if yticks is not None:
|
|
62
|
+
ax.set_xticks(yticks)
|
|
63
|
+
ax.set_xticklabels(yticks,
|
|
64
|
+
fontsize=fontsize,
|
|
65
|
+
family=font_family)
|
|
66
|
+
|
|
67
|
+
# labels
|
|
68
|
+
ax.set_xlabel(xlabel,
|
|
69
|
+
fontsize=fontsize,
|
|
70
|
+
fontfamily=font_family)
|
|
71
|
+
ax.set_ylabel(ylabel,
|
|
72
|
+
fontsize=fontsize,
|
|
73
|
+
fontfamily=font_family)
|
|
74
|
+
|
|
75
|
+
ax.tick_params(axis='x',
|
|
76
|
+
labelsize=fontsize,
|
|
77
|
+
labelfontfamily=font_family)
|
|
78
|
+
ax.tick_params(axis='y',
|
|
79
|
+
labelsize=fontsize,
|
|
80
|
+
labelfontfamily=font_family)
|
|
81
|
+
|
|
82
|
+
# title
|
|
83
|
+
title_pad = title_pad -0.05
|
|
84
|
+
fig.suptitle(title ,
|
|
85
|
+
fontsize = title_fontsize,
|
|
86
|
+
x=0.5,
|
|
87
|
+
y=title_pad)
|
|
88
|
+
|
|
89
|
+
# spines
|
|
90
|
+
ax.spines["top"].set_visible(False)
|
|
91
|
+
ax.spines["right"].set_visible(False)
|
|
92
|
+
ax.spines["left"].set_visible(True)
|
|
93
|
+
ax.spines["bottom"].set_visible(True)
|
|
94
|
+
|
|
95
|
+
save_figure(fig = fig, save = save, keyword=mode, save_args=save_args, log = log, verbose=verbose)
|
|
96
|
+
|
|
97
|
+
log.write("Finished creating plots.", verbose=verbose)
|
|
98
|
+
return fig, ax
|
|
@@ -57,6 +57,8 @@ def plottrumpet(mysumstats,
|
|
|
57
57
|
highlight_color="#CB132D",
|
|
58
58
|
highlight_windowkb = 500,
|
|
59
59
|
highlight_anno_args = None,
|
|
60
|
+
highlight_lim = None,
|
|
61
|
+
highlight_lim_mode = "absolute",
|
|
60
62
|
pinpoint= None,
|
|
61
63
|
pinpoint_color ="red",
|
|
62
64
|
scatter_args=None,
|
|
@@ -235,6 +237,8 @@ def plottrumpet(mysumstats,
|
|
|
235
237
|
highlight=highlight,
|
|
236
238
|
highlight_chrpos=highlight_chrpos,
|
|
237
239
|
highlight_windowkb=highlight_windowkb,
|
|
240
|
+
highlight_lim=highlight_lim,
|
|
241
|
+
highlight_lim_mode=highlight_lim_mode,
|
|
238
242
|
snpid=snpid,
|
|
239
243
|
chrom=chrom,
|
|
240
244
|
pos=pos)
|
|
@@ -19,7 +19,6 @@ src/gwaslab/g_meta_update.py
|
|
|
19
19
|
src/gwaslab/g_vchange_status.py
|
|
20
20
|
src/gwaslab/g_vchange_status_polars.py
|
|
21
21
|
src/gwaslab/g_version.py
|
|
22
|
-
src/gwaslab/hm_harmonize_sumstats.py
|
|
23
22
|
src/gwaslab/run_script.py
|
|
24
23
|
src/gwaslab.egg-info/PKG-INFO
|
|
25
24
|
src/gwaslab.egg-info/SOURCES.txt
|
|
@@ -108,6 +107,7 @@ src/gwaslab/viz/viz_aux_property.py
|
|
|
108
107
|
src/gwaslab/viz/viz_aux_quickfix.py
|
|
109
108
|
src/gwaslab/viz/viz_aux_reposition_text.py
|
|
110
109
|
src/gwaslab/viz/viz_aux_save_figure.py
|
|
110
|
+
src/gwaslab/viz/viz_plot_associations.py
|
|
111
111
|
src/gwaslab/viz/viz_plot_compare_af.py
|
|
112
112
|
src/gwaslab/viz/viz_plot_compare_effect.py
|
|
113
113
|
src/gwaslab/viz/viz_plot_credible_sets.py
|
|
@@ -123,4 +123,5 @@ src/gwaslab/viz/viz_plot_regionalplot.py
|
|
|
123
123
|
src/gwaslab/viz/viz_plot_rg_heatmap.py
|
|
124
124
|
src/gwaslab/viz/viz_plot_scatter_with_reg.py
|
|
125
125
|
src/gwaslab/viz/viz_plot_stackedregional.py
|
|
126
|
+
src/gwaslab/viz/viz_plot_template.py
|
|
126
127
|
src/gwaslab/viz/viz_plot_trumpetplot.py
|