gsMap 1.71.2__py3-none-any.whl → 1.72.3__py3-none-any.whl
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.
- gsMap/GNN/adjacency_matrix.py +25 -27
- gsMap/GNN/model.py +9 -7
- gsMap/GNN/train.py +8 -11
- gsMap/__init__.py +3 -3
- gsMap/__main__.py +3 -2
- gsMap/cauchy_combination_test.py +75 -72
- gsMap/config.py +822 -316
- gsMap/create_slice_mean.py +154 -0
- gsMap/diagnosis.py +179 -101
- gsMap/find_latent_representation.py +28 -26
- gsMap/format_sumstats.py +233 -201
- gsMap/generate_ldscore.py +353 -209
- gsMap/latent_to_gene.py +92 -60
- gsMap/main.py +23 -14
- gsMap/report.py +39 -25
- gsMap/run_all_mode.py +86 -46
- gsMap/setup.py +1 -1
- gsMap/spatial_ldsc_multiple_sumstats.py +154 -80
- gsMap/utils/generate_r2_matrix.py +173 -140
- gsMap/utils/jackknife.py +84 -80
- gsMap/utils/manhattan_plot.py +180 -207
- gsMap/utils/regression_read.py +105 -122
- gsMap/visualize.py +82 -64
- {gsmap-1.71.2.dist-info → gsmap-1.72.3.dist-info}/METADATA +21 -6
- gsmap-1.72.3.dist-info/RECORD +31 -0
- {gsmap-1.71.2.dist-info → gsmap-1.72.3.dist-info}/WHEEL +1 -1
- gsMap/utils/make_annotations.py +0 -518
- gsmap-1.71.2.dist-info/RECORD +0 -31
- {gsmap-1.71.2.dist-info → gsmap-1.72.3.dist-info}/LICENSE +0 -0
- {gsmap-1.71.2.dist-info → gsmap-1.72.3.dist-info}/entry_points.txt +0 -0
gsMap/utils/jackknife.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
"""
|
2
2
|
(c) 2014 Brendan Bulik-Sullivan and Hilary Finucane
|
3
3
|
|
4
4
|
Fast block jackknives.
|
@@ -10,47 +10,46 @@ first dimension to represent # of data points (or # of blocks in a block jackkni
|
|
10
10
|
a block is like a datapoint), and for the second dimension to represent the dimensionality
|
11
11
|
of the data.
|
12
12
|
|
13
|
-
|
13
|
+
"""
|
14
14
|
|
15
|
-
from __future__ import division
|
16
15
|
import numpy as np
|
17
16
|
from scipy.optimize import nnls
|
18
|
-
|
17
|
+
|
18
|
+
np.seterr(divide="raise", invalid="raise")
|
19
19
|
xrange = range
|
20
20
|
|
21
|
+
|
21
22
|
def _check_shape(x, y):
|
22
|
-
|
23
|
+
"""Check that x and y have the correct shapes (for regression jackknives)."""
|
23
24
|
if len(x.shape) != 2 or len(y.shape) != 2:
|
24
|
-
raise ValueError(
|
25
|
+
raise ValueError("x and y must be 2D arrays.")
|
25
26
|
if x.shape[0] != y.shape[0]:
|
26
|
-
raise ValueError(
|
27
|
-
'Number of datapoints in x != number of datapoints in y.')
|
27
|
+
raise ValueError("Number of datapoints in x != number of datapoints in y.")
|
28
28
|
if y.shape[1] != 1:
|
29
|
-
raise ValueError(
|
29
|
+
raise ValueError("y must have shape (n_snp, 1)")
|
30
30
|
n, p = x.shape
|
31
31
|
if p > n:
|
32
|
-
raise ValueError(
|
32
|
+
raise ValueError("More dimensions than datapoints.")
|
33
33
|
|
34
34
|
return (n, p)
|
35
35
|
|
36
36
|
|
37
37
|
def _check_shape_block(xty_block_values, xtx_block_values):
|
38
|
-
|
38
|
+
"""Check that xty_block_values and xtx_block_values have correct shapes."""
|
39
39
|
if xtx_block_values.shape[0:2] != xty_block_values.shape:
|
40
40
|
raise ValueError(
|
41
|
-
|
41
|
+
"Shape of xty_block_values must equal shape of first two dimensions of xty_block_values."
|
42
|
+
)
|
42
43
|
if len(xtx_block_values.shape) < 3:
|
43
|
-
raise ValueError(
|
44
|
+
raise ValueError("xtx_block_values must be a 3D array.")
|
44
45
|
if xtx_block_values.shape[1] != xtx_block_values.shape[2]:
|
45
|
-
raise ValueError(
|
46
|
-
'Last two axes of xtx_block_values must have same dimension.')
|
46
|
+
raise ValueError("Last two axes of xtx_block_values must have same dimension.")
|
47
47
|
|
48
48
|
return xtx_block_values.shape[0:2]
|
49
49
|
|
50
50
|
|
51
|
-
class Jackknife
|
52
|
-
|
53
|
-
'''
|
51
|
+
class Jackknife:
|
52
|
+
"""
|
54
53
|
Base class for jackknife objects. Input involves x,y, so this base class is tailored
|
55
54
|
for statistics computed from independent and dependent variables (e.g., regressions).
|
56
55
|
The __delete_vals_to_pseudovalues__ and __jknife__ methods will still be useful for other
|
@@ -84,30 +83,29 @@ class Jackknife(object):
|
|
84
83
|
Converts delete values and the whole-data estimate to pseudovalues.
|
85
84
|
get_separators():
|
86
85
|
Returns (approximately) evenly-spaced jackknife block boundaries.
|
87
|
-
|
86
|
+
"""
|
88
87
|
|
89
88
|
def __init__(self, x, y, n_blocks=None, separators=None):
|
90
89
|
self.N, self.p = _check_shape(x, y)
|
91
90
|
if separators is not None:
|
92
91
|
if max(separators) != self.N:
|
93
|
-
raise ValueError(
|
94
|
-
'Max(separators) must be equal to number of data points.')
|
92
|
+
raise ValueError("Max(separators) must be equal to number of data points.")
|
95
93
|
if min(separators) != 0:
|
96
|
-
raise ValueError(
|
94
|
+
raise ValueError("Max(separators) must be equal to 0.")
|
97
95
|
self.separators = sorted(separators)
|
98
96
|
self.n_blocks = len(separators) - 1
|
99
97
|
elif n_blocks is not None:
|
100
98
|
self.n_blocks = n_blocks
|
101
99
|
self.separators = self.get_separators(self.N, self.n_blocks)
|
102
100
|
else:
|
103
|
-
raise ValueError(
|
101
|
+
raise ValueError("Must specify either n_blocks are separators.")
|
104
102
|
|
105
103
|
if self.n_blocks > self.N:
|
106
|
-
raise ValueError(
|
104
|
+
raise ValueError("More blocks than data points.")
|
107
105
|
|
108
106
|
@classmethod
|
109
107
|
def jknife(cls, pseudovalues):
|
110
|
-
|
108
|
+
"""
|
111
109
|
Converts pseudovalues to jackknife estimate and variance.
|
112
110
|
|
113
111
|
Parameters
|
@@ -125,7 +123,7 @@ class Jackknife(object):
|
|
125
123
|
jknife_cov : np.matrix with shape (p, p)
|
126
124
|
Covariance matrix of jackknifed estimate.
|
127
125
|
|
128
|
-
|
126
|
+
"""
|
129
127
|
n_blocks = pseudovalues.shape[0]
|
130
128
|
jknife_cov = np.atleast_2d(np.cov(pseudovalues.T, ddof=1) / n_blocks)
|
131
129
|
jknife_var = np.atleast_2d(np.diag(jknife_cov))
|
@@ -135,7 +133,7 @@ class Jackknife(object):
|
|
135
133
|
|
136
134
|
@classmethod
|
137
135
|
def delete_values_to_pseudovalues(cls, delete_values, est):
|
138
|
-
|
136
|
+
"""
|
139
137
|
Converts whole-data estimate and delete values to pseudovalues.
|
140
138
|
|
141
139
|
Parameters
|
@@ -155,23 +153,21 @@ class Jackknife(object):
|
|
155
153
|
ValueError :
|
156
154
|
If est.shape != (1, delete_values.shape[1])
|
157
155
|
|
158
|
-
|
156
|
+
"""
|
159
157
|
n_blocks, p = delete_values.shape
|
160
158
|
if est.shape != (1, p):
|
161
|
-
raise ValueError(
|
162
|
-
'Different number of parameters in delete_values than in est.')
|
159
|
+
raise ValueError("Different number of parameters in delete_values than in est.")
|
163
160
|
|
164
161
|
return n_blocks * est - (n_blocks - 1) * delete_values
|
165
162
|
|
166
163
|
@classmethod
|
167
164
|
def get_separators(cls, N, n_blocks):
|
168
|
-
|
165
|
+
"""Define evenly-spaced block boundaries."""
|
169
166
|
return np.floor(np.linspace(0, N, n_blocks + 1)).astype(int)
|
170
167
|
|
171
168
|
|
172
169
|
class LstsqJackknifeSlow(Jackknife):
|
173
|
-
|
174
|
-
'''
|
170
|
+
"""
|
175
171
|
Slow linear-regression block jackknife. This class computes delete values directly,
|
176
172
|
rather than forming delete values from block values. Useful for testing and for
|
177
173
|
non-negative least squares (which as far as I am aware does not admit a fast block
|
@@ -210,26 +206,29 @@ class LstsqJackknifeSlow(Jackknife):
|
|
210
206
|
delete_values(x, y, func, s):
|
211
207
|
Compute delete values of func(x, y) the slow way, with blocks defined by s.
|
212
208
|
|
213
|
-
|
209
|
+
"""
|
214
210
|
|
215
211
|
def __init__(self, x, y, n_blocks=None, nn=False, separators=None):
|
216
212
|
Jackknife.__init__(self, x, y, n_blocks, separators)
|
217
213
|
if nn: # non-negative least squares
|
218
|
-
|
214
|
+
|
215
|
+
def func(x, y):
|
216
|
+
return np.atleast_2d(nnls(x, np.array(y).T[0])[0])
|
219
217
|
else:
|
220
|
-
|
221
|
-
|
218
|
+
|
219
|
+
def func(x, y):
|
220
|
+
return np.atleast_2d(np.linalg.lstsq(x, np.array(y).T[0])[0])
|
222
221
|
|
223
222
|
self.est = func(x, y)
|
224
223
|
self.delete_values = self.delete_values(x, y, func, self.separators)
|
225
|
-
self.pseudovalues = self.delete_values_to_pseudovalues(
|
226
|
-
|
227
|
-
|
228
|
-
|
224
|
+
self.pseudovalues = self.delete_values_to_pseudovalues(self.delete_values, self.est)
|
225
|
+
(self.jknife_est, self.jknife_var, self.jknife_se, self.jknife_cov) = self.jknife(
|
226
|
+
self.pseudovalues
|
227
|
+
)
|
229
228
|
|
230
229
|
@classmethod
|
231
230
|
def delete_values(cls, x, y, func, s):
|
232
|
-
|
231
|
+
"""
|
233
232
|
Compute delete values by deleting one block at a time.
|
234
233
|
|
235
234
|
Parameters
|
@@ -253,17 +252,21 @@ class LstsqJackknifeSlow(Jackknife):
|
|
253
252
|
ValueError :
|
254
253
|
If x.shape[0] does not equal y.shape[0] or x and y are not 2D.
|
255
254
|
|
256
|
-
|
255
|
+
"""
|
257
256
|
_check_shape(x, y)
|
258
|
-
d = [
|
259
|
-
|
257
|
+
d = [
|
258
|
+
func(
|
259
|
+
np.vstack([x[0 : s[i], ...], x[s[i + 1] :, ...]]),
|
260
|
+
np.vstack([y[0 : s[i], ...], y[s[i + 1] :, ...]]),
|
261
|
+
)
|
262
|
+
for i in xrange(len(s) - 1)
|
263
|
+
]
|
260
264
|
|
261
265
|
return np.concatenate(d, axis=0)
|
262
266
|
|
263
267
|
|
264
268
|
class LstsqJackknifeFast(Jackknife):
|
265
|
-
|
266
|
-
'''
|
269
|
+
"""
|
267
270
|
Fast block jackknife for linear regression.
|
268
271
|
|
269
272
|
Inherits from Jackknife class.
|
@@ -301,21 +304,21 @@ class LstsqJackknifeFast(Jackknife):
|
|
301
304
|
block_values_to_pseudovalues(block_values, est) :
|
302
305
|
Computes pseudovalues and delete values in a single pass over the block values.
|
303
306
|
|
304
|
-
|
307
|
+
"""
|
305
308
|
|
306
309
|
def __init__(self, x, y, n_blocks=None, separators=None):
|
307
310
|
Jackknife.__init__(self, x, y, n_blocks, separators)
|
308
311
|
xty, xtx = self.block_values(x, y, self.separators)
|
309
312
|
self.est = self.block_values_to_est(xty, xtx)
|
310
313
|
self.delete_values = self.block_values_to_delete_values(xty, xtx)
|
311
|
-
self.pseudovalues = self.delete_values_to_pseudovalues(
|
312
|
-
|
313
|
-
|
314
|
-
|
314
|
+
self.pseudovalues = self.delete_values_to_pseudovalues(self.delete_values, self.est)
|
315
|
+
(self.jknife_est, self.jknife_var, self.jknife_se, self.jknife_cov) = self.jknife(
|
316
|
+
self.pseudovalues
|
317
|
+
)
|
315
318
|
|
316
319
|
@classmethod
|
317
320
|
def block_values(cls, x, y, s):
|
318
|
-
|
321
|
+
"""
|
319
322
|
Compute block values.
|
320
323
|
|
321
324
|
Parameters
|
@@ -341,22 +344,22 @@ class LstsqJackknifeFast(Jackknife):
|
|
341
344
|
ValueError :
|
342
345
|
If x.shape[0] does not equal y.shape[0] or x and y are not 2D.
|
343
346
|
|
344
|
-
|
347
|
+
"""
|
345
348
|
n, p = _check_shape(x, y)
|
346
349
|
n_blocks = len(s) - 1
|
347
350
|
xtx_block_values = np.zeros((n_blocks, p, p))
|
348
351
|
xty_block_values = np.zeros((n_blocks, p))
|
349
352
|
for i in range(n_blocks):
|
350
353
|
xty_block_values[i, ...] = np.dot(
|
351
|
-
x[s[i]:s[i + 1], ...].T, y[s[i]:s[i + 1], ...]
|
352
|
-
|
353
|
-
|
354
|
+
x[s[i] : s[i + 1], ...].T, y[s[i] : s[i + 1], ...]
|
355
|
+
).reshape((1, p))
|
356
|
+
xtx_block_values[i, ...] = np.dot(x[s[i] : s[i + 1], ...].T, x[s[i] : s[i + 1], ...])
|
354
357
|
|
355
358
|
return (xty_block_values, xtx_block_values)
|
356
359
|
|
357
360
|
@classmethod
|
358
361
|
def block_values_to_est(cls, xty_block_values, xtx_block_values):
|
359
|
-
|
362
|
+
"""
|
360
363
|
Converts block values to the whole-data linear regression estimate.
|
361
364
|
|
362
365
|
Parameters
|
@@ -379,7 +382,7 @@ class LstsqJackknifeFast(Jackknife):
|
|
379
382
|
If the last two dimensions of xtx_block_values are not equal or if the first two
|
380
383
|
dimensions of xtx_block_values do not equal the shape of xty_block_values.
|
381
384
|
|
382
|
-
|
385
|
+
"""
|
383
386
|
n_blocks, p = _check_shape_block(xty_block_values, xtx_block_values)
|
384
387
|
xty = np.sum(xty_block_values, axis=0)
|
385
388
|
xtx = np.sum(xtx_block_values, axis=0)
|
@@ -387,7 +390,7 @@ class LstsqJackknifeFast(Jackknife):
|
|
387
390
|
|
388
391
|
@classmethod
|
389
392
|
def block_values_to_delete_values(cls, xty_block_values, xtx_block_values):
|
390
|
-
|
393
|
+
"""
|
391
394
|
Converts block values to delete values.
|
392
395
|
|
393
396
|
Parameters
|
@@ -412,7 +415,7 @@ class LstsqJackknifeFast(Jackknife):
|
|
412
415
|
If the last two dimensions of xtx_block_values are not equal or if the first two
|
413
416
|
dimensions of xtx_block_values do not equal the shape of xty_block_values.
|
414
417
|
|
415
|
-
|
418
|
+
"""
|
416
419
|
n_blocks, p = _check_shape_block(xty_block_values, xtx_block_values)
|
417
420
|
delete_values = np.zeros((n_blocks, p))
|
418
421
|
xty_tot = np.sum(xty_block_values, axis=0)
|
@@ -420,15 +423,13 @@ class LstsqJackknifeFast(Jackknife):
|
|
420
423
|
for j in range(n_blocks):
|
421
424
|
delete_xty = xty_tot - xty_block_values[j]
|
422
425
|
delete_xtx = xtx_tot - xtx_block_values[j]
|
423
|
-
delete_values[j, ...] = np.linalg.solve(
|
424
|
-
delete_xtx, delete_xty).reshape((1, p))
|
426
|
+
delete_values[j, ...] = np.linalg.solve(delete_xtx, delete_xty).reshape((1, p))
|
425
427
|
|
426
428
|
return delete_values
|
427
429
|
|
428
430
|
|
429
431
|
class RatioJackknife(Jackknife):
|
430
|
-
|
431
|
-
'''
|
432
|
+
"""
|
432
433
|
Block jackknife ratio estimate.
|
433
434
|
|
434
435
|
Jackknife.
|
@@ -461,28 +462,32 @@ class RatioJackknife(Jackknife):
|
|
461
462
|
(numerator / close to zero) and -(numerator / close to zero), i.e., (big) and -(big),
|
462
463
|
and so the jackknife will (correctly) yield huge SE.
|
463
464
|
|
464
|
-
|
465
|
+
"""
|
465
466
|
|
466
467
|
def __init__(self, est, numer_delete_values, denom_delete_values):
|
467
468
|
if numer_delete_values.shape != denom_delete_values.shape:
|
468
|
-
raise ValueError(
|
469
|
-
'numer_delete_values.shape != denom_delete_values.shape.')
|
469
|
+
raise ValueError("numer_delete_values.shape != denom_delete_values.shape.")
|
470
470
|
if len(numer_delete_values.shape) != 2:
|
471
|
-
raise ValueError(
|
472
|
-
if
|
473
|
-
|
474
|
-
|
471
|
+
raise ValueError("Delete values must be matrices.")
|
472
|
+
if (
|
473
|
+
len(est.shape) != 2
|
474
|
+
or est.shape[0] != 1
|
475
|
+
or est.shape[1] != numer_delete_values.shape[1]
|
476
|
+
):
|
477
|
+
raise ValueError("Shape of est does not match shape of delete values.")
|
475
478
|
|
476
479
|
self.n_blocks = numer_delete_values.shape[0]
|
477
480
|
self.est = est
|
478
|
-
self.pseudovalues = self.delete_values_to_pseudovalues(
|
479
|
-
|
480
|
-
|
481
|
-
|
481
|
+
self.pseudovalues = self.delete_values_to_pseudovalues(
|
482
|
+
self.est, denom_delete_values, numer_delete_values
|
483
|
+
)
|
484
|
+
(self.jknife_est, self.jknife_var, self.jknife_se, self.jknife_cov) = self.jknife(
|
485
|
+
self.pseudovalues
|
486
|
+
)
|
482
487
|
|
483
488
|
@classmethod
|
484
489
|
def delete_values_to_pseudovalues(cls, est, denom, numer):
|
485
|
-
|
490
|
+
"""
|
486
491
|
Converts delete values to pseudovalues.
|
487
492
|
|
488
493
|
Parameters
|
@@ -504,11 +509,10 @@ class RatioJackknife(Jackknife):
|
|
504
509
|
ValueError :
|
505
510
|
If numer.shape != denom.shape.
|
506
511
|
|
507
|
-
|
512
|
+
"""
|
508
513
|
n_blocks, p = denom.shape
|
509
514
|
pseudovalues = np.zeros((n_blocks, p))
|
510
515
|
for j in range(0, n_blocks):
|
511
|
-
pseudovalues[j, ...] = n_blocks * est -
|
512
|
-
(n_blocks - 1) * numer[j, ...] / denom[j, ...]
|
516
|
+
pseudovalues[j, ...] = n_blocks * est - (n_blocks - 1) * numer[j, ...] / denom[j, ...]
|
513
517
|
|
514
518
|
return pseudovalues
|