maradoner 0.14.3__tar.gz → 0.16.0__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 maradoner might be problematic. Click here for more details.

Files changed (26) hide show
  1. {maradoner-0.14.3 → maradoner-0.16.0}/PKG-INFO +1 -3
  2. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/__init__.py +1 -1
  3. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/export.py +39 -1
  4. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/grn.py +9 -6
  5. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/main.py +25 -3
  6. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner.egg-info/PKG-INFO +1 -3
  7. {maradoner-0.14.3 → maradoner-0.16.0}/setup.py +0 -2
  8. {maradoner-0.14.3 → maradoner-0.16.0}/README.md +0 -0
  9. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/create.py +0 -0
  10. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/dataset_filter.py +0 -0
  11. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/fit.py +0 -0
  12. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/mara/__init__.py +0 -0
  13. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/mara/export.py +0 -0
  14. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/mara/fit.py +0 -0
  15. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/mara/main.py +0 -0
  16. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/mara.py +0 -0
  17. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/meta_optimizer.py +0 -0
  18. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/select.py +0 -0
  19. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/synthetic_data.py +0 -0
  20. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner/utils.py +0 -0
  21. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner.egg-info/SOURCES.txt +0 -0
  22. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner.egg-info/dependency_links.txt +0 -0
  23. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner.egg-info/entry_points.txt +0 -0
  24. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner.egg-info/requires.txt +0 -0
  25. {maradoner-0.14.3 → maradoner-0.16.0}/maradoner.egg-info/top_level.txt +0 -0
  26. {maradoner-0.14.3 → maradoner-0.16.0}/setup.cfg +0 -0
@@ -1,13 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: maradoner
3
- Version: 0.14.3
3
+ Version: 0.16.0
4
4
  Summary: Variance-adjusted estimation of motif activities.
5
5
  Home-page: https://github.com/autosome-ru/maradoner
6
6
  Author: Georgy Meshcheryakov
7
7
  Author-email: iam@georgy.top
8
8
  Classifier: Programming Language :: Python :: 3.11
9
- Classifier: Programming Language :: Python :: 3.12
10
- Classifier: Programming Language :: Python :: 3.13
11
9
  Classifier: Topic :: Scientific/Engineering
12
10
  Classifier: Operating System :: OS Independent
13
11
  Requires-Python: >=3.11
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- __version__ = '0.14.3'
2
+ __version__ = '0.16.0'
3
3
  import importlib
4
4
 
5
5
 
@@ -407,7 +407,45 @@ def export_results(project_name: str, output_folder: str,
407
407
  promoter_names_test = np.array(data.promoter_names)[fit.promoter_inds_to_drop]
408
408
  export_fov(test, os.path.join(folder, 'test'), promoter_names=promoter_names_test,
409
409
  sample_names=sample_names)
410
-
410
+
411
+ def export_pairwise_test(project_name: str, output_folder: str,
412
+ group_a: str, group_b: str):
413
+ data = read_init(project_name)
414
+ fmt = data.fmt
415
+ motif_names = data.motif_names
416
+ prom_names = data.promoter_names
417
+ del data
418
+ with openers[fmt](f'{project_name}.fit.{fmt}', 'rb') as f:
419
+ fit: FitResult = dill.load(f)
420
+ if fit.promoter_inds_to_drop:
421
+ prom_names = np.delete(prom_names, fit.promoter_inds_to_drop)
422
+ group_names = fit.group_names
423
+ with openers[fmt](f'{project_name}.predict.{fmt}', 'rb') as f:
424
+ act: ActivitiesPrediction = dill.load(f)
425
+ if act.filtered_motifs is not None:
426
+ motif_names_filtered = np.delete(motif_names, act.filtered_motifs)
427
+ else:
428
+ motif_names_filtered = motif_names
429
+ i = group_names.index(group_a)
430
+ j = group_names.index(group_b)
431
+ variances_a = None
432
+ variances_b = None
433
+ for k, cov in enumerate(act.cov()):
434
+ if k == i:
435
+ variances_a = cov.diagonal()
436
+ elif k == j:
437
+ variances_b = cov.diagonal()
438
+ U = act.U
439
+ U_a = U[:, i]
440
+ U_b = U[:, j]
441
+ z_stat = (U_b - U_a) / (variances_a + variances_b) ** 0.5
442
+ pval = 2 * norm.sf(np.abs(z_stat))
443
+ fdr = multitest.multipletests(pval, alpha=0.05, method='fdr_by')[1]
444
+ data = np.array([z_stat, pval, fdr]).T
445
+ filename = os.path.join(output_folder, f'{group_a}_vs_{group_b}.tsv')
446
+ os.makedirs(output_folder, exist_ok=True)
447
+ DF(data, columns=['z_stat', 'pval', 'fdr'],
448
+ index=motif_names_filtered).to_csv(filename, sep='\t')
411
449
 
412
450
  def export_loadings_product(project_name: str, output_folder: str,
413
451
  use_hdf: bool = True, intercepts: bool = True,
@@ -122,7 +122,7 @@ def bayesian_fdr_control(p0, alpha=0.05):
122
122
  return discoveries, threshold
123
123
 
124
124
  def grn(project_name: str, output: str, use_hdf=False, save_stat=True,
125
- fdr_alpha=0.05, prior_h1=1/100):
125
+ fdr_alpha=0.05, prior_h1=1/100, include_mean: bool = True):
126
126
  data = read_init(project_name)
127
127
  fmt = data.fmt
128
128
  with openers[fmt](f'{project_name}.fit.{fmt}', 'rb') as f:
@@ -178,13 +178,16 @@ def grn(project_name: str, output: str, use_hdf=False, save_stat=True,
178
178
  os.makedirs(folder_stat, exist_ok=True)
179
179
  os.makedirs(folder_belief, exist_ok=True)
180
180
  for sigma, nu, name, inds in zip(promvar.T[..., None], nus, group_names, group_inds):
181
- # if name != 'anconeus':
182
- # continue
183
181
  print(name)
184
182
  var = (B_hat * nu + sigma)
185
- Y_ = Y[:, inds][..., None, :] + BM
186
- # theta = U[:, inds][..., None, :] + BM
187
- theta = B[..., None] * U[:, inds] + BM
183
+
184
+ Y_ = Y[:, inds][..., None, :]
185
+ theta = B[..., None] * U[:, inds]
186
+ if include_mean:
187
+ Y_ = Y_ + BM
188
+ theta = theta + BM
189
+
190
+
188
191
  loglr = 2 * B * (Y_ * theta).sum(axis=-1) - B_pow * (theta ** 2).sum(axis=-1)
189
192
  del Y_
190
193
  del theta
@@ -18,6 +18,7 @@ from .synthetic_data import generate_dataset
18
18
  from time import time
19
19
  from dill import __version__ as dill_version
20
20
  from .export import export_results, export_loadings_product, Standardization, ANOVAType
21
+ from .export import export_pairwise_test
21
22
  from . import __version__ as project_version
22
23
  from .select import select_motifs_single
23
24
  import json
@@ -176,7 +177,7 @@ def _fit(name: str = Argument(..., help='Project name.'),
176
177
 
177
178
  @app.command('gof', help='Estimate GOFs given test/train data split. Provides test info only if [orange]test-chromosomes[/orange] is not None in [cyan]fit[/cyan].')
178
179
  def _gof(name: str = Argument(..., help='Project name.'),
179
- use_groups: bool = Option(False, help='Compute statistic for sammples aggragated across groups.'),
180
+ use_groups: bool = Option(False, help='Compute statistic for samples aggragated across groups.'),
180
181
  stat_type: GOFStat = Option(GOFStat.fov, help='Statistic type to compute'),
181
182
  stat_mode: GOFStatMode = Option(GOFStatMode.total, help='Whether to compute stats for residuals or accumulate their effects'),
182
183
  gpu: bool = Option(False, help='Use GPU if available for most of computations.'),
@@ -320,12 +321,13 @@ def _grn(name: str = Argument(..., help='Project name'),
320
321
  ' comparable to the expression file size.'),
321
322
  hdf: bool = Option(True, help='Use HDF format instead of tar.gz files. Typically eats much less space'),
322
323
  stat: bool = Option(True, help='Save statistics alongside probabilities.'),
323
- prior_h1: float = Option(1/10, help='Prior belief on the expected fraction of motifs active per promoter.')):
324
+ prior_h1: float = Option(1/10, help='Prior belief on the expected fraction of motifs active per promoter.'),
325
+ means: bool = Option(True, help='Include motif-specific means in both H_0 and H_1 models, otherwise only activities deviations are being tested.')):
324
326
  t0 = time()
325
327
  p = Progress(SpinnerColumn(speed=0.5), TextColumn("[progress.description]{task.description}"), transient=True)
326
328
  p.add_task(description="Building GRN...", total=None)
327
329
  p.start()
328
- grn(name, output=folder, use_hdf=hdf, save_stat=stat, prior_h1=prior_h1)
330
+ grn(name, output=folder, use_hdf=hdf, save_stat=stat, prior_h1=prior_h1, include_mean=means)
329
331
  p.stop()
330
332
  dt = time() - t0
331
333
  rprint(f'[green][bold]✔️[/bold] Done![/green]\t time: {dt:.2f} s.')
@@ -348,6 +350,26 @@ def _estimate_promoter_variance(name: str = Argument(..., help='Project name'),
348
350
  p.stop()
349
351
  dt = time() - t0
350
352
  rprint(f'[green][bold]✔️[/bold] Done![/green]\t time: {dt:.2f} s.')
353
+
354
+ @app.command('pairwise-difftest',
355
+ help='Perform pairwise differential test between 2 groups using posterior distribution of activities.'
356
+ ' It computes difference in activities between group_b and group_a and performs a series of Z-tests for each motif.')
357
+ def _pairwise_difftest(name: str = Argument(..., help='Project name'),
358
+ group_a: str = Argument(...,
359
+ help='Name of the first group.'
360
+ ),
361
+ group_b: str = Argument(...,
362
+ help='Name of the second group.'
363
+ ),
364
+ output_folder: Path = Argument(..., help='Output folder.') ):
365
+ t0 = time()
366
+ p = Progress(SpinnerColumn(speed=0.5), TextColumn("[progress.description]{task.description}"), transient=True)
367
+ p.add_task(description="Performing and saving a pairwise test...", total=None)
368
+ p.start()
369
+ export_pairwise_test(name, output_folder, group_a, group_b)
370
+ p.stop()
371
+ dt = time() - t0
372
+ rprint(f'[green][bold]✔️[/bold] Done![/green]\t time: {dt:.2f} s.')
351
373
 
352
374
  def main():
353
375
  check_packages()
@@ -1,13 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: maradoner
3
- Version: 0.14.3
3
+ Version: 0.16.0
4
4
  Summary: Variance-adjusted estimation of motif activities.
5
5
  Home-page: https://github.com/autosome-ru/maradoner
6
6
  Author: Georgy Meshcheryakov
7
7
  Author-email: iam@georgy.top
8
8
  Classifier: Programming Language :: Python :: 3.11
9
- Classifier: Programming Language :: Python :: 3.12
10
- Classifier: Programming Language :: Python :: 3.13
11
9
  Classifier: Topic :: Scientific/Engineering
12
10
  Classifier: Operating System :: OS Independent
13
11
  Requires-Python: >=3.11
@@ -27,8 +27,6 @@ setup(
27
27
  url="https://github.com/autosome-ru/maradoner",
28
28
  classifiers=[
29
29
  "Programming Language :: Python :: 3.11",
30
- "Programming Language :: Python :: 3.12",
31
- "Programming Language :: Python :: 3.13",
32
30
  "Topic :: Scientific/Engineering",
33
31
  "Operating System :: OS Independent"]
34
32
 
File without changes
File without changes
File without changes
File without changes