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/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
- np.seterr(divide='raise', invalid='raise')
17
+
18
+ np.seterr(divide="raise", invalid="raise")
19
19
  xrange = range
20
20
 
21
+
21
22
  def _check_shape(x, y):
22
- '''Check that x and y have the correct shapes (for regression jackknives).'''
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('x and y must be 2D arrays.')
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('y must have shape (n_snp, 1)')
29
+ raise ValueError("y must have shape (n_snp, 1)")
30
30
  n, p = x.shape
31
31
  if p > n:
32
- raise ValueError('More dimensions than datapoints.')
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
- '''Check that xty_block_values and xtx_block_values have correct shapes.'''
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
- 'Shape of xty_block_values must equal shape of first two dimensions of xty_block_values.')
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('xtx_block_values must be a 3D array.')
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(object):
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('Max(separators) must be equal to 0.')
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('Must specify either n_blocks are separators.')
101
+ raise ValueError("Must specify either n_blocks are separators.")
104
102
 
105
103
  if self.n_blocks > self.N:
106
- raise ValueError('More blocks than data points.')
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
- '''Define evenly-spaced block boundaries.'''
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
- func = lambda x, y: np.atleast_2d(nnls(x, np.array(y).T[0])[0])
214
+
215
+ def func(x, y):
216
+ return np.atleast_2d(nnls(x, np.array(y).T[0])[0])
219
217
  else:
220
- func = lambda x, y: np.atleast_2d(
221
- np.linalg.lstsq(x, np.array(y).T[0])[0])
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
- self.delete_values, self.est)
227
- (self.jknife_est, self.jknife_var, self.jknife_se, self.jknife_cov) =\
228
- self.jknife(self.pseudovalues)
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 = [func(np.vstack([x[0:s[i], ...], x[s[i + 1]:, ...]]), np.vstack([y[0:s[i], ...], y[s[i + 1]:, ...]]))
259
- for i in xrange(len(s) - 1)]
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
- self.delete_values, self.est)
313
- (self.jknife_est, self.jknife_var, self.jknife_se, self.jknife_cov) =\
314
- self.jknife(self.pseudovalues)
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], ...]).reshape((1, p))
352
- xtx_block_values[i, ...] = np.dot(
353
- x[s[i]:s[i + 1], ...].T, x[s[i]:s[i + 1], ...])
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('Delete values must be matrices.')
472
- if len(est.shape) != 2 or est.shape[0] != 1 or est.shape[1] != numer_delete_values.shape[1]:
473
- raise ValueError(
474
- 'Shape of est does not match shape of delete values.')
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(self.est,
479
- denom_delete_values, numer_delete_values)
480
- (self.jknife_est, self.jknife_var, self.jknife_se, self.jknife_cov) =\
481
- self.jknife(self.pseudovalues)
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