Wet-lab: an assay with a nominal factor#

Design an enzyme-activity assay whose buffer type is nominal, scored with the QQ-aware maxproqq.

An enzyme-activity assay is being optimised in a wet lab across four factors: pH, incubation temperature, buffer type, and substrate concentration. Buffer type is a nominal (unordered categorical) factor, which changes how the design must be scored. A held-out validation set is reserved so the fitted response can be checked on unseen conditions.

Because the space contains a nominal factor, the design is scored with maxproqq. A QQ-type criterion handles the mix of numeric and categorical factors correctly; a purely numeric criterion (phi_p, MaxPro, …) would treat the buffer labels as if they had a numeric distance, which is meaningless for unordered categories and would distort the design.

Parameters#

  • pH (5.0-9.0, continuous, 0.1 steps): the physiological range over which the enzyme is active, at the precision a pH meter can be set to.

  • temperature (25-45 degC, 5-degree steps): the assay incubator’s discrete temperature settings.

  • buffer (nominal: ‘phosphate’, ‘tris’, ‘acetate’): three common buffers with no intrinsic ordering.

  • substrate (integer, 1-10 mM): substrate concentration in whole millimolar steps.

What to look at#

  • summary() and quality_report(): the design covers the mixed factor space; the percentiles remain meaningful because maxproqq scores the numeric and nominal factors appropriately.

  • The saved pairplot: the buffer panels should show all three levels visited, and the numeric factors should be evenly spread.

  • enzyme_design.csv: the run list for the bench.

Mergen features used#

  • A nominal factor alongside continuous / discrete / integer factors.

  • Per-parameter rounding on the continuous pH axis.

  • criteria='maxproqq' as the correct choice for a space containing a nominal factor.

  • A validation hold-out via set_design(n_validation=...).

Estimated runtime: a few seconds to a minute.

from mergen import ParameterSpace, Sampler

# 1. Define the mixed-factor assay space.
space = ParameterSpace({
    'pH':          ('continuous', 5.0, 9.0, {'resolution': 41, 'round': 1}),
    'temperature': range(25, 46, 5),                       # 25, 30, ..., 45
    'buffer':      ('nominal', ['phosphate', 'tris', 'acetate']),
    'substrate':   ('integer', 1, 10),                     # mM
})

# 2. Build the design with maxproqq (correct for a nominal factor) and
#    reserve a validation set for the assay.
sampler = Sampler(space)
sampler.set_design(n_samples=24, n_validation=6)
result = sampler.run(criteria='maxproqq')

# 3. Inspect and save the bench run list.
result.summary()
result.quality_report()
result.plot('pairplot', save=True)
result.to_csv('enzyme_design.csv')
  [WARNING]  n_samples (24) < recommended 10*n_parameters (40, Loeppky et al. 2009). Design quality may be reduced.

════════════════════════════════════════════════════════════
  MERGEN — Space-filling Design
════════════════════════════════════════════════════════════
  Parameters      : 4
  Candidates      : 6,150
  n_samples       : 24  (prescribed_in=0, focus_in=0, optimised_slots=24)
  Total design    : 24
  Validation      : 6
  Criterion       : maxproqq
  Algorithm(s)    : sa
────────────────────────────────────────────────────────────
  [MERGEN]   Optimising (criterion=maxproqq, algorithm=sa)...
  [SA]       Restart 1/5
  [SA]       Tuning temperature...
  [SA]       Start  log(score)=15.408  T=3.1388e+12  iters=2400  swappable=24  hybrid=0.50
    iter  500/2400  T=4.607e+11  best log(score)=15.164
    iter 1000/2400  T=6.762e+10  best log(score)=15.164
    iter 1500/2400  T=9.926e+09  best log(score)=15.164
    iter 2000/2400  T=1.457e+09  best log(score)=15.164
  [SA]       Done   log(score)=15.164  (accepted=2162/2400, rate=90.1%)
  [SA]       Restart 1: new best  log(score)=15.164
  [SA]       Restart 2/5
  [SA]       Tuning temperature...
  [SA]       Start  log(score)=27.591  T=3.7693e+12  iters=2400  swappable=24  hybrid=0.50
    iter  500/2400  T=5.533e+11  best log(score)=27.591
    iter 1000/2400  T=8.121e+10  best log(score)=26.375
    iter 1500/2400  T=1.192e+10  best log(score)=26.375
    iter 2000/2400  T=1.750e+09  best log(score)=24.692
  [SA]       Done   log(score)=24.692  (accepted=2182/2400, rate=90.9%)
  [SA]       Restart 3/5
  [SA]       Tuning temperature...
  [SA]       Start  log(score)=31.573  T=3.2188e+12  iters=2400  swappable=24  hybrid=0.50
    iter  500/2400  T=4.725e+11  best log(score)=26.516
    iter 1000/2400  T=6.935e+10  best log(score)=22.577
    iter 1500/2400  T=1.018e+10  best log(score)=22.577
    iter 2000/2400  T=1.494e+09  best log(score)=15.401
  [SA]       Done   log(score)=15.401  (accepted=2173/2400, rate=90.5%)
  [SA]       Restart 4/5
  [SA]       Tuning temperature...
  [SA]       Start  log(score)=30.392  T=5.3897e+12  iters=2400  swappable=24  hybrid=0.50
    iter  500/2400  T=7.911e+11  best log(score)=25.569
    iter 1000/2400  T=1.161e+11  best log(score)=25.569
    iter 1500/2400  T=1.704e+10  best log(score)=25.569
    iter 2000/2400  T=2.502e+09  best log(score)=25.569
  [SA]       Done   log(score)=25.569  (accepted=2180/2400, rate=90.8%)
  [SA]       Restart 5/5
  [SA]       Tuning temperature...
  [SA]       Start  log(score)=29.433  T=3.6355e+12  iters=2400  swappable=24  hybrid=0.50
    iter  500/2400  T=5.336e+11  best log(score)=25.930
    iter 1000/2400  T=7.832e+10  best log(score)=25.930
    iter 1500/2400  T=1.150e+10  best log(score)=25.930
    iter 2000/2400  T=1.687e+09  best log(score)=25.930
  [SA]       Done   log(score)=25.930  (accepted=2160/2400, rate=90.0%)
  [MERGEN]   sa     done -- score=3.851e+06  (elapsed 12.9s)

────────────────────────────────────────────────────────────
  MERGEN — Final Design
────────────────────────────────────────────────────────────
  Prescribed (in)  : 0
  Prescribed (out) : 0
  Focus (in)       : 0
  Focus (out)      : 0
  Optimised        : 24
  Total design     : 24
  Validation       : 6
════════════════════════════════════════════════════════════

────────────────────────────────────────────────────
  MERGEN Design Summary
────────────────────────────────────────────────────
  Optimised       : 24
  Total design    : 24
  Validation      : 6
────────────────────────────────────────────────────
  Parameters      : 4
  Candidates      : 6150
  Criterion       : maxproqq
  Seed            : 44
  Algorithm       : sa
────────────────────────────────────────────────────

  [METRICS]  Computing MC baseline (300 designs)...
  [METRICS]  MC baseline complete (300 designs).

════════════════════════════════════════════════════════════════════════
  MERGEN Design Metrics  (n=24, d=4)
════════════════════════════════════════════════════════════════════════
  Metric                      Value    Baseline  Better when        Rank
────────────────────────────────────────────────────────────────────────
  Min distance               0.2550      0.1218  higher         97th pct
  Minimax distance           1.1435      1.1512  lower          60th pct
  Max |correlation|          0.2436      0.2600  lower          56th pct
  2D projection CD2          0.0976      0.1535  lower         100th pct
  CV distances               0.2770      0.2912  lower          84th pct
  Mean distance              1.1117      1.0942  higher         68th pct
────────────────────────────────────────────────────────────────────────
  Criterion scores
────────────────────────────────────────────────────────────────────────
  MAXPROQQ                   3.8505e+06  1.0762e+13  100th pct  lower
────────────────────────────────────────────────────────────────────────
  Baseline: 300 MC designs from feasible space  |  Rank = percentile among baseline designs
════════════════════════════════════════════════════════════════════════

  Saved: outputs/pairplot_13.png
  Saved: outputs/enzyme_design.csv  (30 rows)
11 wetlab biology

Total running time of the script: (0 minutes 15.252 seconds)

Gallery generated by Sphinx-Gallery