ECaviar-based colocalisation analysis.
It extends CAVIAR framework to explicitly estimate the posterior probability that the same variant is causal in 2 studies while accounting for the uncertainty of LD. eCAVIAR computes the colocalization posterior probability (CLPP) by utilizing the marginal posterior probabilities. This framework allows for multiple variants to be causal in a single locus.
Source code in src/gentropy/method/colocalisation.py
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 | class ECaviar:
"""ECaviar-based colocalisation analysis.
It extends [CAVIAR](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5142122/#bib18) framework to explicitly estimate the posterior probability that the same variant is causal in 2 studies while accounting for the uncertainty of LD. eCAVIAR computes the colocalization posterior probability (**CLPP**) by utilizing the marginal posterior probabilities. This framework allows for **multiple variants to be causal** in a single locus.
"""
METHOD_NAME: str = "eCAVIAR"
METHOD_METRIC: str = "clpp"
@staticmethod
def _get_clpp(left_pp: Column, right_pp: Column) -> Column:
"""Calculate the colocalisation posterior probability (CLPP).
If the fact that the same variant is found causal for two studies are independent events,
CLPP is defined as the product of posterior porbabilities that a variant is causal in both studies.
Args:
left_pp (Column): left posterior probability
right_pp (Column): right posterior probability
Returns:
Column: CLPP
Examples:
>>> d = [{"left_pp": 0.5, "right_pp": 0.5}, {"left_pp": 0.25, "right_pp": 0.75}]
>>> df = spark.createDataFrame(d)
>>> df.withColumn("clpp", ECaviar._get_clpp(f.col("left_pp"), f.col("right_pp"))).show()
+-------+--------+------+
|left_pp|right_pp| clpp|
+-------+--------+------+
| 0.5| 0.5| 0.25|
| 0.25| 0.75|0.1875|
+-------+--------+------+
<BLANKLINE>
"""
return left_pp * right_pp
@classmethod
def colocalise(
cls: type[ECaviar], overlapping_signals: StudyLocusOverlap
) -> Colocalisation:
"""Calculate bayesian colocalisation based on overlapping signals.
Args:
overlapping_signals (StudyLocusOverlap): overlapping signals.
Returns:
Colocalisation: colocalisation results based on eCAVIAR.
"""
return Colocalisation(
_df=(
overlapping_signals.df.withColumn(
"clpp",
ECaviar._get_clpp(
f.col("statistics.left_posteriorProbability"),
f.col("statistics.right_posteriorProbability"),
),
)
.groupBy("leftStudyLocusId", "rightStudyLocusId", "chromosome")
.agg(
f.count("*").alias("numberColocalisingVariants"),
f.sum(f.col("clpp")).alias("clpp"),
)
.withColumn("colocalisationMethod", f.lit(cls.METHOD_NAME))
),
_schema=Colocalisation.get_schema(),
)
|
colocalise(overlapping_signals: StudyLocusOverlap) -> Colocalisation
classmethod
Calculate bayesian colocalisation based on overlapping signals.
Parameters:
Returns:
Name | Type |
Description |
Colocalisation |
Colocalisation
|
colocalisation results based on eCAVIAR.
|
Source code in src/gentropy/method/colocalisation.py
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 | @classmethod
def colocalise(
cls: type[ECaviar], overlapping_signals: StudyLocusOverlap
) -> Colocalisation:
"""Calculate bayesian colocalisation based on overlapping signals.
Args:
overlapping_signals (StudyLocusOverlap): overlapping signals.
Returns:
Colocalisation: colocalisation results based on eCAVIAR.
"""
return Colocalisation(
_df=(
overlapping_signals.df.withColumn(
"clpp",
ECaviar._get_clpp(
f.col("statistics.left_posteriorProbability"),
f.col("statistics.right_posteriorProbability"),
),
)
.groupBy("leftStudyLocusId", "rightStudyLocusId", "chromosome")
.agg(
f.count("*").alias("numberColocalisingVariants"),
f.sum(f.col("clpp")).alias("clpp"),
)
.withColumn("colocalisationMethod", f.lit(cls.METHOD_NAME))
),
_schema=Colocalisation.get_schema(),
)
|