bedapub / bedapub/designit

`optimize_multi_plate_design` does not optimize within plate distribution of covariates

Open
#48 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
HTML
Stars
9
Forks
1
Avg merge
10h 23m
Merged PRs (30d)
4

Description

`optimize_multi_plate_design` does not really optimize within plate distribution of covariates. Instead, clusters form.

Replacing the parameters p = 1 and penalize_lines = "none" fixes the issue but these cannot be set in optimize_multi_plate_design

Example

```r
samples <- structure(list(Subject.Number = c(1, 2, 3, 3, 4, 4, 5, 5, 6,
7, 7, 8, 8, 9, 10, 10, 11, 12, 13, 13, 14, 14, 15, 15, 16, 17,
17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 24, 25, 26, 26, 27,
27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
42, 43, 43, 44, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54,
55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68), Gender = c("Male",
"Male", "Female", "Female", "Male", "Male", "Male", "Male", "Male",
"Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male",
"Female", "Female", "Female", "Female", "Female", "Male", "Male",
"Female", "Female", "Female", "Female", "Female", "Female", "Female",
"Female", "Male", "Male", "Male", "Male", "Male", "Male", "Male",
"Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male",
"Male", "Female", "Female", "Male", "Female", "Male", "Male",
"Male", "Female", "Male", "Male", "Male", "Female", "Female",
"Female", "Female", "Male", "Female", "Female", "Male", "Female",
"Male", "Male", "Male", "Female", "Female", "Male", "Male", "Male",
"Female", "Female", "Male", "Male", "Female", "Male", "Male",
"Male", "Male", "Female", "Female", "Female"), Timepoint = c("DAY 1",
"DAY 1", "DAY 1", "DAY 168", "DAY 1", "DAY 168", "DAY 1", "DAY 112",
"DAY 1", "DAY 1", "DAY 112", "DAY 1", "DAY 112", "DAY 1", "DAY 1",
"DAY 112", "DAY 1", "DAY 1", "DAY 1", "DAY 168", "DAY 1", "DAY 112",
"DAY 1", "DAY 112", "DAY 1", "DAY 1", "DAY 112", "DAY 1", "DAY 112",
"DAY 1", "DAY 112", "DAY 1", "DAY 1", "DAY 112", "DAY 1", "DAY 112",
"DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 112", "DAY 1", "DAY 112",
"DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1",
"DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1",
"DAY 1", "DAY 168", "DAY 1", "DAY 112", "DAY 1", "DAY 112", "DAY 1",
"DAY 1", "DAY 112", "DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1",
"DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1",
"DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1", "DAY 1",
"DAY 1", "DAY 1", "DAY 1"), Site = c("350545", "350545", "350545",
"350545", "350545", "350545", "350545", "350545", "350545", "350545",
"350545", "350545", "350545", "350545", "350545", "350545", "350545",
"350545", "350545", "350545", "350545", "350545", "350545", "350545",
"350545", "350545", "350545", "350545", "350545", "350545", "350545",
"350545", "350545", "350545", "350545", "350545", "350545", "350545",
"350545", "350545", "350545", "350545", "350545", "350545", "350545",
"350545", "350545", "350545", "350545", "350545", "350545", "350545",
"350545", "356312", "356312", "356312", "356312", "356312", "356312",
"356312", "356312", "356312", "356312", "356312", "356312", "356312",
"356312", "356312", "356312", "356312", "356312", "356312", "356312",
"356312", "356312", "356312", "356312", "356312", "356312", "356312",
"356312", "356312", "356312", "356312", "356312", "356312", "356312",
"356312"), Previous_treatment = c("Tx naive", "Pre-treated",
"Tx naive", "Tx naive", "Pre-treated", "Pre-treated", "Pre-treated",
"Pre-treated", "Pre-treated", "Pre-treated", "Pre-treated", "Pre-treated",
"Pre-treated", "Tx naive", "Pre-treated", "Pre-treated", "Pre-treated",
"Pre-treated", "Tx naive", "Tx naive", "Tx naive", "Tx naive",
"Tx naive", "Tx naive", "Tx naive", "Tx naive", "Tx naive", "Tx naive",
"Tx naive", "Tx naive", "Tx naive", "Tx naive", "Tx naive", "Tx naive",
"Pre-treated", "Pre-treated", "Tx naive", "Tx naive", "Pre-treated",
"Tx naive", "Tx naive", "Tx naive", "Tx naive", "Tx naive", "Tx naive",
"Tx naive", "Pre-treated", "Pre-treated", "Pre-treated", "Pre-treated",
"Pre-treated", "Pre-treated", "Tx naive", "Tx naive", "Pre-treated",
"Pre-treated", "Pre-treated", "Pre-treated", "Pre-treated", "Pre-treated",
"Pre-treated", "Pre-treated", "Pre-treated", "Pre-treated", "Pre-treated",
"Pre-treated", "Pre-treated", "Tx naive", "Pre-treated", "Pre-treated",
"Tx naive", "Tx naive", "Tx naive", "Tx naive", "Tx naive", NA,
"Pre-treated", "Pre-treated", "Pre-treated", "Tx naive", "Tx naive",
"Pre-treated", "Pre-treated", "Pre-treated", "Pre-treated", "Pre-treated",
"Pre-treated", "Tx naive")), row.names = c(NA, -88L), class = "data.frame")

# make batch container
bc <- BatchContainer$new(
dimensions = list(
"plate" = 1,
"row" = list(values =c(1:8)),
"column" = list(values = c(1:11))
)
)

# initial assignment
bc <- assign_in_order(bc, samples)

# factors to balance
balance_variables <- c("Site", "Timepoint", "Previous_treatment", "Gender")

# running the wrapper
bc1 <- optimize_multi_plate_design(bc,
within_plate_variables = balance_variables,
plate = "plate",
row = "row",
column = "column",
n_shuffle = 2,
max_iter = 3000,
quiet = TRUE
)

# plot site
print(plot_plate(bc$get_samples(remove_empty_locations = FALSE),
column = column, row = row,
.color = Site)

# running it manually
# set scoring function for each balance variable
scoring_funcs <- purrr::map(
balance_variables,
~ mk_plate_scoring_functions(bc, row = "row", column = "column", group = .x, p = 1, penalize_lines = "none")
) %>% unlist()
names(scoring_funcs) <- balance_variables

bc2 <- optimize_design(
bc,
scoring = scoring_funcs,
max_iter = 3000,
quiet = TRUE,
acceptance_func = accept_leftmost_improvement
)

# plot site
print(plot_plate(bc$get_samples(remove_empty_locations = FALSE),
column = column, row = row,
.color = Site)
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by tracing optimize_multi_plate_design and compare its scoring setup with the manually constructed scoring_funcs passed to optimize_design. Use the supplied samples and balance_variables to reproduce the clustered plate distribution. Done means the wrapper supports the needed scoring behavior and produces within-plate distributions consistent with the manual run.

Written by the indexing model from the issue text.

Assessment

Tech stack
r
Domain
data
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.